@goodea/echolet 0.1.0 → 0.1.1

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.
@@ -3722,4 +3722,457 @@ body {
3722
3722
  top: 310px;
3723
3723
  }
3724
3724
 
3725
+ /* ===========================================================================
3726
+ STATION ACCESSIBILITY AND SMALL-VIEWPORT SAFETY
3727
+ =========================================================================== */
3725
3728
 
3729
+ /* These controls belong to the application shell, while the radio hardware
3730
+ remains decorative unless a component receives a real callback. */
3731
+ :where(button, input, select, textarea) {
3732
+ font: inherit;
3733
+ }
3734
+
3735
+ :where(button, input, select, textarea, [role="button"]):focus-visible {
3736
+ outline: 3px solid #facc15;
3737
+ outline-offset: 3px;
3738
+ box-shadow: 0 0 0 6px rgba(250, 204, 21, 0.28);
3739
+ }
3740
+
3741
+ .nordic-encoder-control,
3742
+ .nordic-jog-assembly,
3743
+ .nordic-color-knob {
3744
+ appearance: none;
3745
+ -webkit-appearance: none;
3746
+ margin: 0;
3747
+ padding: 0;
3748
+ font: inherit;
3749
+ }
3750
+
3751
+ button.nordic-encoder-control,
3752
+ button.nordic-jog-assembly,
3753
+ button.nordic-color-knob {
3754
+ display: block;
3755
+ }
3756
+
3757
+ .nordic-encoder-pointer {
3758
+ position: absolute;
3759
+ top: 4px;
3760
+ left: 50%;
3761
+ transform: translateX(-50%);
3762
+ width: 3px;
3763
+ height: 10px;
3764
+ border-radius: 2px;
3765
+ background-color: #ffffff;
3766
+ box-shadow: 0 1px 2px rgba(0,0,0,0.5);
3767
+ }
3768
+
3769
+ .station-empty-state {
3770
+ width: min(100%, 42rem);
3771
+ margin: auto;
3772
+ padding: clamp(1rem, 3vw, 2rem);
3773
+ border: 2px solid currentColor;
3774
+ border-radius: 12px;
3775
+ background: rgba(0, 0, 0, 0.32);
3776
+ color: inherit;
3777
+ text-align: center;
3778
+ font-size: clamp(1rem, 1.6vw, 1.125rem);
3779
+ line-height: 1.5;
3780
+ }
3781
+
3782
+ .station-empty-actions,
3783
+ .dialog-actions {
3784
+ display: flex;
3785
+ flex-wrap: wrap;
3786
+ gap: 0.75rem;
3787
+ align-items: center;
3788
+ justify-content: center;
3789
+ margin-top: 1rem;
3790
+ }
3791
+
3792
+ .station-empty-actions button,
3793
+ .dialog-actions button,
3794
+ .station-theme-field select {
3795
+ min-height: 2.75rem;
3796
+ padding: 0.6rem 0.9rem;
3797
+ border: 2px solid currentColor;
3798
+ border-radius: 6px;
3799
+ font-size: 1rem;
3800
+ font-weight: 750;
3801
+ line-height: 1.2;
3802
+ }
3803
+
3804
+ .station-status,
3805
+ .station-profile-status {
3806
+ display: inline-flex;
3807
+ align-items: center;
3808
+ gap: 0.4rem;
3809
+ min-height: 2rem;
3810
+ padding: 0.25rem 0.55rem;
3811
+ border: 1px solid currentColor;
3812
+ border-radius: 999px;
3813
+ font-size: 0.875rem;
3814
+ font-weight: 750;
3815
+ line-height: 1.25;
3816
+ }
3817
+
3818
+ .station-status[data-state="connected"],
3819
+ .station-profile-status[data-state="verified"] {
3820
+ color: #14532d;
3821
+ background: #dcfce7;
3822
+ }
3823
+
3824
+ .station-status[data-state="disconnected"],
3825
+ .station-profile-status[data-state="unverified"] {
3826
+ color: #7f1d1d;
3827
+ background: #fee2e2;
3828
+ }
3829
+
3830
+ .station-status[data-state="unknown"],
3831
+ .station-profile-status[data-state="unknown"] {
3832
+ color: #713f12;
3833
+ background: #fef3c7;
3834
+ }
3835
+
3836
+ .station-theme-field {
3837
+ display: grid;
3838
+ gap: 0.35rem;
3839
+ min-width: min(100%, 14rem);
3840
+ color: inherit;
3841
+ font-size: 0.9rem;
3842
+ font-weight: 750;
3843
+ }
3844
+
3845
+ .station-theme-field select {
3846
+ width: 100%;
3847
+ color: #111827;
3848
+ background: #ffffff;
3849
+ }
3850
+
3851
+ .card-dialog {
3852
+ position: fixed;
3853
+ z-index: 1000;
3854
+ inset: 0;
3855
+ display: grid;
3856
+ place-items: center;
3857
+ overflow: auto;
3858
+ padding: clamp(1rem, 4vw, 2rem);
3859
+ background: rgba(0, 0, 0, 0.72);
3860
+ }
3861
+
3862
+ .dialog-content {
3863
+ width: min(100%, 42rem);
3864
+ max-height: min(90dvh, 48rem);
3865
+ overflow: auto;
3866
+ padding: clamp(1rem, 3vw, 2rem);
3867
+ border: 2px solid #facc15;
3868
+ border-radius: 10px;
3869
+ color: #f8fafc;
3870
+ background: #172033;
3871
+ font-size: 1rem;
3872
+ line-height: 1.5;
3873
+ box-shadow: 0 1.5rem 4rem rgba(0, 0, 0, 0.55);
3874
+ }
3875
+
3876
+ .dialog-content label {
3877
+ display: grid;
3878
+ gap: 0.35rem;
3879
+ margin-top: 0.9rem;
3880
+ font-weight: 700;
3881
+ }
3882
+
3883
+ .dialog-content input,
3884
+ .dialog-content textarea {
3885
+ width: 100%;
3886
+ min-height: 2.75rem;
3887
+ padding: 0.65rem;
3888
+ border: 2px solid #94a3b8;
3889
+ border-radius: 6px;
3890
+ color: #0f172a;
3891
+ background: #ffffff;
3892
+ }
3893
+
3894
+ .dialog-content textarea {
3895
+ min-height: 10rem;
3896
+ resize: vertical;
3897
+ }
3898
+
3899
+ .dialog-error {
3900
+ margin-top: 0.9rem;
3901
+ padding: 0.7rem;
3902
+ border-left: 4px solid #f87171;
3903
+ color: #fecaca;
3904
+ background: #450a0a;
3905
+ font-weight: 700;
3906
+ }
3907
+
3908
+ .card-preview {
3909
+ max-width: 100%;
3910
+ overflow: auto;
3911
+ margin-top: 1rem;
3912
+ padding: 0.9rem;
3913
+ border: 1px solid #64748b;
3914
+ border-radius: 6px;
3915
+ color: #e2e8f0;
3916
+ background: #020617;
3917
+ font: 0.875rem/1.45 ui-monospace, SFMono-Regular, Menlo, monospace;
3918
+ white-space: pre-wrap;
3919
+ overflow-wrap: anywhere;
3920
+ }
3921
+
3922
+ /* Parchment needs a dark, opaque empty-state surface; white text on cream is
3923
+ unreadable and this keeps the vintage visual language intact. */
3924
+ .skin-vintage-radiola .station-empty-state {
3925
+ color: #2b1307;
3926
+ background: rgba(255, 248, 235, 0.94);
3927
+ border-color: #78350f;
3928
+ box-shadow: 0 0.5rem 1.5rem rgba(43, 19, 7, 0.3);
3929
+ }
3930
+
3931
+ .skin-vintage-radiola .station-empty-actions button,
3932
+ .skin-vintage-radiola .station-theme-field select {
3933
+ color: #2b1307;
3934
+ background: #fde8c8;
3935
+ border-color: #78350f;
3936
+ }
3937
+
3938
+ /* OP-1 telemetry is data, not etched decoration: preserve the pale skin while
3939
+ bringing its type up to a readable size and contrast. */
3940
+ .skin-nordic-op1 .telemetry-mini-stream,
3941
+ .skin-nordic-op1 .term-stream-box {
3942
+ color: #0f172a;
3943
+ background: #ffffff;
3944
+ }
3945
+
3946
+ .skin-nordic-op1 .term-stream-title {
3947
+ font-size: 0.875rem;
3948
+ font-weight: 800;
3949
+ }
3950
+
3951
+ .skin-nordic-op1 .term-msg-line {
3952
+ color: #0f172a;
3953
+ font-size: 0.8125rem;
3954
+ line-height: 1.45;
3955
+ }
3956
+
3957
+ .skin-nordic-op1 .term-msg-line.success { color: #166534; }
3958
+ .skin-nordic-op1 .term-msg-line.crypto { color: #854d0e; }
3959
+ .skin-nordic-op1 .term-msg-line.warn { color: #9a3412; }
3960
+ .skin-nordic-op1 .term-msg-line.error { color: #b91c1c; }
3961
+ .skin-nordic-op1 .term-msg-line.info { color: #334155; }
3962
+
3963
+ @media (max-width: 900px), (max-height: 640px) {
3964
+ body {
3965
+ height: auto;
3966
+ min-height: 100dvh;
3967
+ overflow: auto;
3968
+ }
3969
+
3970
+ .radio-outer-wrap {
3971
+ width: 100%;
3972
+ height: auto;
3973
+ min-height: 100dvh;
3974
+ align-items: stretch;
3975
+ padding: 0.5rem;
3976
+ overflow: visible;
3977
+ }
3978
+
3979
+ .radio-cabinet {
3980
+ width: 100%;
3981
+ height: auto;
3982
+ min-height: calc(100dvh - 1rem);
3983
+ max-height: none;
3984
+ overflow: visible;
3985
+ }
3986
+
3987
+ .radio-main-body {
3988
+ flex: initial;
3989
+ flex-direction: column;
3990
+ overflow: visible;
3991
+ }
3992
+
3993
+ .hardware-contacts-zone,
3994
+ .hardware-chat-zone,
3995
+ .hardware-controls-zone {
3996
+ width: 100%;
3997
+ min-width: 0;
3998
+ min-height: 15rem;
3999
+ flex: initial;
4000
+ }
4001
+
4002
+ .hardware-chat-zone {
4003
+ order: 1;
4004
+ }
4005
+
4006
+ .hardware-contacts-zone,
4007
+ .hardware-controls-zone {
4008
+ order: 2;
4009
+ }
4010
+
4011
+ .hardware-input-form {
4012
+ flex-wrap: wrap;
4013
+ }
4014
+
4015
+ .hardware-input-field {
4016
+ min-width: 0;
4017
+ font-size: 1rem;
4018
+ }
4019
+
4020
+ .hardware-transmit-button {
4021
+ min-height: 2.75rem;
4022
+ font-size: 0.95rem;
4023
+ }
4024
+
4025
+ .station-empty-actions > *,
4026
+ .dialog-actions > * {
4027
+ flex: 1 1 12rem;
4028
+ }
4029
+ }
4030
+
4031
+ @media (max-width: 620px) {
4032
+ .station-empty-state,
4033
+ .dialog-content {
4034
+ font-size: 1rem;
4035
+ }
4036
+
4037
+ .station-empty-actions > *,
4038
+ .dialog-actions > * {
4039
+ flex-basis: 100%;
4040
+ }
4041
+
4042
+ .nordic-encoders-2x2 {
4043
+ gap: 0.75rem;
4044
+ }
4045
+
4046
+ .hardware-msg-text {
4047
+ font-size: 1rem;
4048
+ }
4049
+ }
4050
+
4051
+ @media (prefers-reduced-motion: reduce) {
4052
+ *,
4053
+ *::before,
4054
+ *::after {
4055
+ scroll-behavior: auto !important;
4056
+ animation-duration: 0.01ms !important;
4057
+ animation-iteration-count: 1 !important;
4058
+ transition-duration: 0.01ms !important;
4059
+ }
4060
+ }
4061
+
4062
+ /* App shell integration: the station status is a section of several facts,
4063
+ while the theme label and selector intentionally share one class. */
4064
+ .station-status {
4065
+ display: flex;
4066
+ width: 100%;
4067
+ flex: 0 0 auto;
4068
+ flex-wrap: wrap;
4069
+ align-items: center;
4070
+ justify-content: center;
4071
+ gap: 0.45rem 0.75rem;
4072
+ min-height: 2.5rem;
4073
+ padding: 0.45rem 0.75rem;
4074
+ border: 0;
4075
+ border-radius: 0;
4076
+ font-size: 0.875rem;
4077
+ }
4078
+
4079
+ .station-status-label,
4080
+ .station-profile-status {
4081
+ display: inline-flex;
4082
+ align-items: center;
4083
+ min-width: 0;
4084
+ overflow-wrap: anywhere;
4085
+ }
4086
+
4087
+ .station-status-label {
4088
+ padding: 0.2rem 0.45rem;
4089
+ border-radius: 999px;
4090
+ color: inherit;
4091
+ background: rgba(255, 255, 255, 0.13);
4092
+ font-weight: 700;
4093
+ }
4094
+
4095
+ span.station-theme-field {
4096
+ display: block;
4097
+ min-width: 0;
4098
+ color: inherit;
4099
+ font-size: 0.8125rem;
4100
+ font-weight: 800;
4101
+ line-height: 1.25;
4102
+ }
4103
+
4104
+ select.station-theme-field {
4105
+ display: block;
4106
+ width: 100%;
4107
+ min-width: 10rem;
4108
+ min-height: 2.5rem;
4109
+ padding: 0.45rem 0.55rem;
4110
+ font-size: 0.9375rem;
4111
+ font-weight: 750;
4112
+ line-height: 1.2;
4113
+ }
4114
+
4115
+ @media (max-width: 900px), (max-height: 640px) {
4116
+ .station-status {
4117
+ justify-content: flex-start;
4118
+ padding-inline: 0.65rem;
4119
+ }
4120
+
4121
+ .radiola-top-deck,
4122
+ .military-top-deck,
4123
+ .hifi-top-deck,
4124
+ .crt-top-deck,
4125
+ .nixie-top-deck,
4126
+ .nordic-top-deck {
4127
+ display: flex !important;
4128
+ height: auto !important;
4129
+ min-height: 0;
4130
+ flex-wrap: wrap;
4131
+ align-items: center;
4132
+ justify-content: center;
4133
+ gap: 0.75rem;
4134
+ padding: 0.75rem;
4135
+ overflow: visible;
4136
+ }
4137
+
4138
+ .radiola-top-deck > *,
4139
+ .military-top-deck > *,
4140
+ .hifi-top-deck > *,
4141
+ .crt-top-deck > *,
4142
+ .nixie-top-deck > *,
4143
+ .nordic-top-deck > * {
4144
+ max-width: 100%;
4145
+ min-width: 0;
4146
+ }
4147
+
4148
+ select.station-theme-field {
4149
+ max-width: 100%;
4150
+ }
4151
+ }
4152
+
4153
+ @media (max-width: 480px) {
4154
+ .station-status-label,
4155
+ .station-profile-status {
4156
+ width: 100%;
4157
+ justify-content: center;
4158
+ text-align: center;
4159
+ }
4160
+
4161
+ .radiola-top-deck,
4162
+ .military-top-deck,
4163
+ .hifi-top-deck,
4164
+ .crt-top-deck,
4165
+ .nixie-top-deck,
4166
+ .nordic-top-deck {
4167
+ align-items: stretch;
4168
+ }
4169
+
4170
+ .radiola-top-deck > *,
4171
+ .military-top-deck > *,
4172
+ .hifi-top-deck > *,
4173
+ .crt-top-deck > *,
4174
+ .nixie-top-deck > *,
4175
+ .nordic-top-deck > * {
4176
+ width: 100%;
4177
+ }
4178
+ }