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:
92 Share Tech Mono,
93 monospace;
94 }
95}
96
97.ticket {
98 font-family: F25_Bank_Printer, monospace;
99 @apply bg-white dark:bg-gray-800 p-8 relative overflow-hidden;
100 position: relative;
101 /* Angled corners */
102 clip-path: polygon(
103 20px 0,
104 /* Top left corner */ calc(100% - 20px) 0,
105 /* Top right corner */ 100% 20px,
106 /* Top right */ 100% calc(100% - 20px),
107 /* Bottom right */ calc(100% - 20px) 100%,
108 /* Bottom right corner */ 20px 100%,
109 /* Bottom left corner */ 0 calc(100% - 20px),
110 /* Bottom left */ 0 20px /* Back to top left */
111 );
112}
113
114/* Create side perforations using pseudo-elements */
115.ticket::before,
116.ticket::after {
117 content: "";
118 position: absolute;
119 top: 30px;
120 bottom: 30px;
121 width: 1px;
122 background-image: linear-gradient(
123 to bottom,
124 transparent 0%,
125 transparent 40%,
126 currentColor 40%,
127 currentColor 60%,
128 transparent 60%,
129 transparent 100%
130 );
131 background-size: 100% 20px;
132 background-repeat: repeat-y;
133 opacity: 0.2;
134}
135
136.ticket::before {
137 left: 8px;
138}
139
140.ticket::after {
141 right: 8px;
142}
143
144.dark .ticket {
145 background-image:
146 radial-gradient(
147 circle at 10px center,
148 rgb(17 24 39) 4px,
149 transparent 4px
150 ),
151 radial-gradient(
152 circle at calc(100% - 10px) center,
153 rgb(17 24 39) 4px,
154 transparent 4px
155 );
156}
157
158/* Remove the previous background images and corner cuts */
159.ticket::before,
160.ticket::after {
161 display: none;
162}
163
164.boarding-label {
165 @apply absolute top-2 right-2 bg-blue-100 dark:bg-blue-900 px-3 py-1 rounded-full text-xs font-bold uppercase tracking-wider;
166 transform: rotate(2deg);
167}
168
169.flight-info {
170 @apply flex justify-between items-center mt-4 pt-4 border-t border-dashed;
171}
172
173.passenger-info {
174 @apply text-sm text-gray-600 dark:text-gray-400 mt-2;
175}
176
177/* Modern Airport Sign Styles */
178.airport-sign {
179 position: relative;
180 transform-origin: top;
181 transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
182 border-radius: 0.5rem;
183 backdrop-filter: blur(8px);
184}
185
186/* Dropdown panel styles */
187.airport-sign + div {
188 border-radius: 0.5rem;
189 backdrop-filter: blur(8px);
190}
191
192/* Remove old texture styles */
193.airport-sign,
194.airport-sign + div {
195 background-blend-mode: overlay;
196}
197
198@keyframes popin {
199 0% { opacity: 0; transform: scale(0.95); }
200 100% { opacity: 1; transform: scale(1); }
201}
202.animate-popin {
203 animation: popin 0.25s cubic-bezier(0.4,0,0.2,1);
204}
205@keyframes bounce-short {
206 0%, 100% { transform: translateY(0); }
207 50% { transform: translateY(-8px); }
208}
209.animate-bounce-short {
210 animation: bounce-short 0.5s;
211}