-
-
-
-
+
+
+
-
-
-
-
-
-
+
diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css
index 17ac00f..c875337 100644
--- a/apps/web/src/styles.css
+++ b/apps/web/src/styles.css
@@ -56,6 +56,7 @@ input:focus-visible {
min-height: 0;
margin: 0 auto;
overflow: hidden;
+ overflow: clip;
overscroll-behavior: none;
background: #f7faf9;
box-shadow: 0 0 40px rgba(25, 53, 48, 0.14);
@@ -924,6 +925,8 @@ input:focus-visible {
background: color-mix(in srgb, var(--category-color) 13%, white);
box-shadow: 0 10px 24px rgba(29, 57, 50, 0.22);
isolation: isolate;
+ visibility: hidden;
+ pointer-events: none;
}
.meta-category-button.active > * {
@@ -965,7 +968,10 @@ input:focus-visible {
-webkit-backdrop-filter: blur(7px);
}
-.category-coordinate {
+.category-wheel-selector {
+ --wheel-size: clamp(286px, 88vw, 344px);
+ --center-size: clamp(122px, 35vw, 140px);
+ --option-radius: calc((var(--wheel-size) + var(--center-size)) / 4);
position: absolute;
top: 0;
right: 0;
@@ -976,174 +982,149 @@ input:focus-visible {
pointer-events: none;
}
-.selector-path {
+.wheel-level-label {
position: absolute;
- top: -2px;
- right: 100%;
- width: min(392px, calc(100vw - 88px));
- height: 76px;
- display: flex;
- align-items: center;
- justify-content: flex-end;
- gap: 6px;
- overflow: visible;
- border: 0;
- padding: 2px 6px;
- background: transparent;
- pointer-events: auto;
-}
-
-.selector-path > button {
- width: 72px;
- min-width: 72px;
- height: 72px;
- display: inline-flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- gap: 0;
+ width: 1px;
+ height: 1px;
overflow: hidden;
- border: 2px solid color-mix(in srgb, var(--path-color) 72%, #263b36);
- border-radius: 50%;
- padding: 0;
- background: var(--path-color);
- color: #ffffff;
- font-weight: 740;
+ clip: rect(0 0 0 0);
+ clip-path: inset(50%);
white-space: nowrap;
- box-shadow: 0 9px 22px rgba(29, 57, 50, 0.2);
}
-.selector-path > button:active,
-.selector-path > button:focus-visible {
- background: color-mix(in srgb, var(--path-color) 82%, #213832);
- transform: translateY(1px);
-}
-
-.selector-path > button svg {
- flex: 0 0 auto;
-}
-
-.selector-path small {
- max-width: 62px;
- overflow: hidden;
- font-size: 13px;
- line-height: 1.1;
- text-overflow: ellipsis;
-}
-
-.selector-path > svg {
- flex: 0 0 auto;
- color: #8ca09b;
-}
-
-.candidate-above-axis,
-.candidate-below-axis {
+.category-wheel-stage {
position: absolute;
- right: -24px;
- width: 120px;
- background: transparent;
- pointer-events: auto;
-}
-
-.candidate-above-axis {
- bottom: 60px;
- overflow: hidden;
- mask-image: linear-gradient(
- to bottom,
- transparent 0,
- #000 30px,
- #000 calc(100% - 34px),
- transparent calc(100% - 16px),
- transparent 100%
- );
- -webkit-mask-image: linear-gradient(
- to bottom,
- transparent 0,
- #000 30px,
- #000 calc(100% - 34px),
- transparent calc(100% - 16px),
- transparent 100%
- );
-}
-
-.candidate-below-axis {
- top: 70px;
- height: 208px;
- overflow: hidden;
- mask-image: linear-gradient(to bottom, #000 0, #000 calc(100% - 30px), transparent 100%);
- -webkit-mask-image: linear-gradient(to bottom, #000 0, #000 calc(100% - 30px), transparent 100%);
-}
-
-.candidate-axis-viewport {
- width: 100%;
- height: 100%;
- overflow: hidden;
+ top: 50%;
+ left: 50%;
+ width: var(--wheel-size);
+ height: var(--wheel-size);
+ transform: translate(-50%, -50%);
+ border-radius: 50%;
touch-action: none;
user-select: none;
cursor: grab;
+ pointer-events: auto;
}
-.candidate-axis-viewport:active {
+.category-wheel-stage.dragging {
cursor: grabbing;
}
-.candidate-axis-list {
- width: 120px;
- min-height: max-content;
- display: flex;
- flex-direction: column;
- gap: 10px;
- padding: 10px 24px 240px;
+.category-wheel-rotor {
+ position: absolute;
+ inset: 0;
+ transform: rotate(var(--wheel-rotation));
+ transform-origin: center;
+ will-change: transform;
}
-.coordinate-option {
- width: 72px;
- min-width: 72px;
- height: 72px;
- min-height: 72px;
+.category-wheel-disc {
+ position: absolute;
+ inset: 0;
+ border-radius: 50%;
+ background: var(--ring-background);
+ box-shadow: 0 14px 34px rgba(29, 55, 48, 0.24);
+ -webkit-mask: radial-gradient(
+ circle,
+ transparent 0 calc(var(--center-size) / 2),
+ #000 calc(var(--center-size) / 2 + 1px)
+ );
+ mask: radial-gradient(
+ circle,
+ transparent 0 calc(var(--center-size) / 2),
+ #000 calc(var(--center-size) / 2 + 1px)
+ );
+}
+
+.wheel-option {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 48px;
+ height: 54px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
- gap: 0;
- border: 2px solid color-mix(in srgb, var(--option-color) 50%, white);
- border-radius: 50%;
+ gap: 3px;
+ transform:
+ translate(-50%, -50%)
+ rotate(var(--option-angle))
+ translateY(calc(0px - var(--option-radius)));
+ border: 0;
padding: 0;
- background: color-mix(in srgb, var(--option-tint) 74%, white);
- color: var(--option-color);
- font-size: 13px;
- line-height: 1.05;
- font-weight: 730;
+ background: transparent;
+ color: #ffffff;
+ font-size: 11px;
+ line-height: 1;
+ font-weight: 760;
+ text-shadow: 0 1px 3px rgba(19, 35, 31, 0.3);
white-space: nowrap;
- box-shadow: 0 9px 22px rgba(29, 57, 50, 0.2);
+ pointer-events: auto;
}
-.coordinate-option.selected {
- border-color: color-mix(in srgb, var(--option-color) 75%, #263b36);
- background: var(--option-color);
- color: #ffffff;
- box-shadow: 0 0 0 4px rgba(255, 255, 255, 0.78), 0 11px 25px rgba(29, 57, 50, 0.25);
-}
-
-.coordinate-option.selected .coordinate-icon {
- color: #ffffff;
-}
-
-.coordinate-icon {
- width: 28px;
- height: 28px;
- flex: 0 0 auto;
- display: grid;
- place-items: center;
- color: var(--option-color);
-}
-
-.coordinate-option > span:last-child {
- max-width: 62px;
+.wheel-option span {
+ max-width: 48px;
overflow: hidden;
text-overflow: ellipsis;
}
+.wheel-option.selected::after {
+ position: absolute;
+ bottom: -5px;
+ left: 50%;
+ width: 5px;
+ height: 5px;
+ transform: translateX(-50%);
+ border-radius: 50%;
+ background: #ffffff;
+ box-shadow: 0 1px 3px rgba(19, 35, 31, 0.25);
+ content: "";
+}
+
+.wheel-center-controls {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ z-index: 2;
+ width: var(--center-size);
+ height: var(--center-size);
+ display: grid;
+ grid-template-rows: 1fr 1fr;
+ transform: translate(-50%, -50%);
+ overflow: hidden;
+ border-radius: 50%;
+ box-shadow: 0 8px 24px rgba(29, 55, 48, 0.22);
+ pointer-events: auto;
+}
+
+.wheel-center-controls button {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 5px;
+ border: 0;
+ padding: 0;
+ font-size: 12px;
+ font-weight: 740;
+}
+
+.wheel-back {
+ border-bottom: 1px solid rgba(56, 72, 67, 0.14) !important;
+ background: #eef3f1;
+ color: #52635e;
+}
+
+.wheel-back:disabled {
+ color: #a6b0ad;
+ cursor: default;
+}
+
+.wheel-confirm {
+ background: #6f7f83;
+ color: #ffffff;
+}
+
.share-sheet-layer {
position: absolute;
inset: 0;