@hyalo/angular 0.0.0-stage → 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 (83) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +21 -0
  3. package/README.md +32 -3
  4. package/fesm2022/hyalo-angular-accordion.mjs +230 -0
  5. package/fesm2022/hyalo-angular-accordion.mjs.map +1 -0
  6. package/fesm2022/hyalo-angular-button.mjs +203 -0
  7. package/fesm2022/hyalo-angular-button.mjs.map +1 -0
  8. package/fesm2022/hyalo-angular-card.mjs +221 -0
  9. package/fesm2022/hyalo-angular-card.mjs.map +1 -0
  10. package/fesm2022/hyalo-angular-choice.mjs +788 -0
  11. package/fesm2022/hyalo-angular-choice.mjs.map +1 -0
  12. package/fesm2022/hyalo-angular-dialog.mjs +571 -0
  13. package/fesm2022/hyalo-angular-dialog.mjs.map +1 -0
  14. package/fesm2022/hyalo-angular-field.mjs +312 -0
  15. package/fesm2022/hyalo-angular-field.mjs.map +1 -0
  16. package/fesm2022/hyalo-angular-icon.mjs +343 -0
  17. package/fesm2022/hyalo-angular-icon.mjs.map +1 -0
  18. package/fesm2022/hyalo-angular-interaction.mjs +455 -0
  19. package/fesm2022/hyalo-angular-interaction.mjs.map +1 -0
  20. package/fesm2022/hyalo-angular-navbar.mjs +343 -0
  21. package/fesm2022/hyalo-angular-navbar.mjs.map +1 -0
  22. package/fesm2022/hyalo-angular-overlay.mjs +94 -0
  23. package/fesm2022/hyalo-angular-overlay.mjs.map +1 -0
  24. package/fesm2022/hyalo-angular-popover-overlay-kit-6wPwnxln.mjs +3 -0
  25. package/fesm2022/hyalo-angular-popover.mjs +487 -0
  26. package/fesm2022/hyalo-angular-popover.mjs.map +1 -0
  27. package/fesm2022/hyalo-angular-segmented.mjs +223 -0
  28. package/fesm2022/hyalo-angular-segmented.mjs.map +1 -0
  29. package/fesm2022/hyalo-angular-select.mjs +464 -0
  30. package/fesm2022/hyalo-angular-select.mjs.map +1 -0
  31. package/fesm2022/hyalo-angular-tabs.mjs +324 -0
  32. package/fesm2022/hyalo-angular-tabs.mjs.map +1 -0
  33. package/fesm2022/hyalo-angular-theme.mjs +94 -0
  34. package/fesm2022/hyalo-angular-theme.mjs.map +1 -0
  35. package/fesm2022/hyalo-angular-toast.mjs +322 -0
  36. package/fesm2022/hyalo-angular-toast.mjs.map +1 -0
  37. package/fesm2022/hyalo-angular.mjs +473 -0
  38. package/fesm2022/hyalo-angular.mjs.map +1 -0
  39. package/package.json +133 -3
  40. package/styles/hyalo-core.css +25 -0
  41. package/styles/hyalo.css +17 -0
  42. package/styles/overlays/dialog.css +9 -0
  43. package/styles/overlays/popover.css +9 -0
  44. package/styles/overlays/select.css +9 -0
  45. package/styles/overlays/toast.css +8 -0
  46. package/styles/palettes/aurora.css +47 -0
  47. package/styles/palettes/ember.css +47 -0
  48. package/styles/palettes/graphite.css +47 -0
  49. package/styles/palettes/ocean.css +47 -0
  50. package/styles/palettes/orchid.css +47 -0
  51. package/styles/palettes/rose.css +47 -0
  52. package/styles/parts/card.css +49 -0
  53. package/styles/parts/dialog.css +116 -0
  54. package/styles/parts/drawer.css +124 -0
  55. package/styles/parts/field.css +36 -0
  56. package/styles/parts/glass.css +137 -0
  57. package/styles/parts/motion.css +82 -0
  58. package/styles/parts/navbar.css +55 -0
  59. package/styles/parts/popover.css +27 -0
  60. package/styles/parts/presence.css +55 -0
  61. package/styles/parts/reset.css +42 -0
  62. package/styles/parts/select.css +46 -0
  63. package/styles/parts/themes.css +105 -0
  64. package/styles/parts/toast.css +128 -0
  65. package/styles/parts/tokens.css +151 -0
  66. package/styles/parts/typography.css +64 -0
  67. package/types/hyalo-angular-accordion.d.ts +74 -0
  68. package/types/hyalo-angular-button.d.ts +88 -0
  69. package/types/hyalo-angular-card.d.ts +61 -0
  70. package/types/hyalo-angular-choice.d.ts +259 -0
  71. package/types/hyalo-angular-dialog.d.ts +170 -0
  72. package/types/hyalo-angular-field.d.ts +135 -0
  73. package/types/hyalo-angular-icon.d.ts +122 -0
  74. package/types/hyalo-angular-interaction.d.ts +131 -0
  75. package/types/hyalo-angular-navbar.d.ts +110 -0
  76. package/types/hyalo-angular-overlay.d.ts +31 -0
  77. package/types/hyalo-angular-popover.d.ts +142 -0
  78. package/types/hyalo-angular-segmented.d.ts +79 -0
  79. package/types/hyalo-angular-select.d.ts +130 -0
  80. package/types/hyalo-angular-tabs.d.ts +102 -0
  81. package/types/hyalo-angular-theme.d.ts +46 -0
  82. package/types/hyalo-angular-toast.d.ts +79 -0
  83. package/types/hyalo-angular.d.ts +345 -0
@@ -0,0 +1,36 @@
1
+ /* Controls projected into hy-field. */
2
+ .hy-input {
3
+ flex: 1;
4
+ min-inline-size: 0;
5
+ align-self: stretch;
6
+ padding: 0;
7
+ border: 0;
8
+ outline: 0;
9
+ background: transparent;
10
+ color: var(--hy-ink);
11
+ font: inherit;
12
+ }
13
+
14
+ .hy-input::placeholder {
15
+ color: var(--hy-ink-3);
16
+ opacity: 1;
17
+ }
18
+
19
+ textarea.hy-input {
20
+ padding-block: var(--hy-space-2);
21
+ min-block-size: 5rem;
22
+ resize: vertical;
23
+ line-height: var(--hy-leading);
24
+ }
25
+
26
+ .hy-input:disabled {
27
+ cursor: not-allowed;
28
+ }
29
+
30
+ .hy-field__prefix,
31
+ .hy-field__suffix {
32
+ display: inline-flex;
33
+ align-items: center;
34
+ flex: none;
35
+ color: var(--hy-ink-3);
36
+ }
@@ -0,0 +1,137 @@
1
+ /*
2
+ * The glass material. Any element with .hy-glass and data-material gets it,
3
+ * usually through the hyMaterial directive.
4
+ *
5
+ * Layers, from top to bottom: a pointer glow (driven by --hy-px / --hy-py
6
+ * from the tilt directive), a reflection gradient, and the fill itself.
7
+ *
8
+ * Materials and thicknesses only change custom properties, never the
9
+ * `background` itself. That keeps the fallbacks at the bottom, which do set
10
+ * it, in charge for every material.
11
+ */
12
+
13
+ /* Registered so hover and tilt can fade the glow instead of switching it. */
14
+ @property --hy-glow {
15
+ syntax: '<number>';
16
+ inherits: true;
17
+ initial-value: 0;
18
+ }
19
+
20
+ .hy-glass {
21
+ --_fill-top: var(--hy-glass-fill-top);
22
+ --_fill-bottom: var(--hy-glass-fill-bottom);
23
+ --_tint: var(--hy-glass-tint);
24
+ --_fill: linear-gradient(
25
+ 160deg,
26
+ rgb(var(--_tint) / var(--_fill-top)),
27
+ rgb(var(--_tint) / var(--_fill-bottom))
28
+ );
29
+ /* Thicker glass blurs more; clear glass blurs less. */
30
+ --_depth: 1;
31
+ --_clarity: 1;
32
+ --_blur: calc(var(--hy-glass-blur) * var(--_depth) * var(--_clarity));
33
+ --_shadow: var(--hy-glass-shadow);
34
+ /* The backdrop keeps changing, so secondary text gets more contrast. */
35
+ --hy-ink-2: var(--hy-ink-2-glass);
36
+ --hy-ink-3: var(--hy-ink-3-glass);
37
+ background:
38
+ radial-gradient(
39
+ circle at var(--hy-px, 50%) var(--hy-py, -30%),
40
+ rgb(var(--hy-glass-glow) / var(--hy-glow, 0)),
41
+ transparent 55%
42
+ ),
43
+ var(--hy-glass-reflection), var(--_fill);
44
+ backdrop-filter: blur(var(--_blur)) saturate(var(--hy-glass-saturate));
45
+ -webkit-backdrop-filter: blur(var(--_blur)) saturate(var(--hy-glass-saturate));
46
+ border: 1px solid var(--hy-glass-border);
47
+ box-shadow: var(--hy-glass-edge), var(--_shadow);
48
+ }
49
+
50
+ /* Thickness: bigger surfaces read as heavier material. */
51
+ .hy-glass[data-thickness='thin'] {
52
+ --_depth: 0.5;
53
+ --_shadow: var(--hy-glass-shadow-thin);
54
+ }
55
+
56
+ .hy-glass[data-thickness='thick'] {
57
+ --_depth: 1.6;
58
+ --_shadow: var(--hy-glass-shadow-thick);
59
+ }
60
+
61
+ .hy-glass[data-material='clear'] {
62
+ --_fill-top: calc(var(--hy-glass-fill-top) * 0.4);
63
+ --_fill-bottom: calc(var(--hy-glass-fill-bottom) * 0.3);
64
+ --_clarity: 0.4;
65
+ }
66
+
67
+ .hy-glass[data-material='tinted'] {
68
+ --_fill: linear-gradient(
69
+ 160deg,
70
+ color-mix(in srgb, var(--hy-primary) 22%, transparent),
71
+ color-mix(in srgb, var(--hy-primary) 8%, transparent)
72
+ );
73
+ }
74
+
75
+ .hy-glass[data-material='solid'] {
76
+ --_fill: linear-gradient(var(--hy-surface-1), var(--hy-surface-1));
77
+ --hy-ink-2: inherit;
78
+ --hy-ink-3: inherit;
79
+ backdrop-filter: none;
80
+ -webkit-backdrop-filter: none;
81
+ }
82
+
83
+ /* No blur support, or the user asked for less transparency: go solid. */
84
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
85
+ .hy-glass {
86
+ background: var(--hy-surface-1);
87
+ }
88
+ }
89
+
90
+ @media (prefers-reduced-transparency: reduce), (prefers-contrast: more) {
91
+ .hy-glass {
92
+ background: var(--hy-surface-1);
93
+ backdrop-filter: none;
94
+ -webkit-backdrop-filter: none;
95
+ border-color: var(--hy-line-strong);
96
+ }
97
+ }
98
+
99
+ @media (forced-colors: active) {
100
+ .hy-glass {
101
+ border: 1px solid CanvasText;
102
+ background: Canvas;
103
+ }
104
+ }
105
+
106
+ /*
107
+ * Wrap the page content in .hy-glass-scope when glass overlays (popovers,
108
+ * menus, dialogs) open above glass content. Chrome redraws only a rectangle
109
+ * around a change, grown by each blur it touches. A hover inside a glass
110
+ * overlay can grow it across the edge of glass below, which is then redrawn
111
+ * in part and shows a brighter box.
112
+ *
113
+ * Any filter gives the content its own layer, so changes in an overlay never
114
+ * redraw it. It is also a backdrop root, so glass inside blurs only what is
115
+ * in the scope; painting the page background here keeps that identical.
116
+ * Like any filter, it is the containing block for fixed elements inside it.
117
+ */
118
+ .hy-glass-scope {
119
+ filter: blur(0);
120
+ background: var(--hy-bg);
121
+ }
122
+
123
+ /* Overlay panels and backdrops from CDK. */
124
+ .hy-backdrop {
125
+ background: var(--hy-scrim);
126
+ backdrop-filter: blur(4px);
127
+ -webkit-backdrop-filter: blur(4px);
128
+ }
129
+
130
+ /* Set by HyDialogRef while a dialog or drawer plays its exit animation. */
131
+ .hy-backdrop[data-state='closing'] {
132
+ opacity: 0;
133
+ }
134
+
135
+ .hy-backdrop-transparent {
136
+ background: transparent;
137
+ }
@@ -0,0 +1,82 @@
1
+ /* Styles for the interaction directives: reveal, tilt, magnetic, ripple. */
2
+
3
+ [data-hy-reveal] {
4
+ transition:
5
+ opacity var(--hy-dur-scene) var(--hy-ease-out) var(--hy-reveal-delay, 0ms),
6
+ translate var(--hy-dur-scene) var(--hy-ease-out) var(--hy-reveal-delay, 0ms),
7
+ scale var(--hy-dur-scene) var(--hy-ease-out) var(--hy-reveal-delay, 0ms);
8
+ }
9
+
10
+ [data-hy-reveal='hidden'] {
11
+ opacity: 0;
12
+ }
13
+
14
+ [data-hy-reveal='hidden'][data-hy-reveal-from='up'] {
15
+ translate: 0 1.5rem;
16
+ }
17
+
18
+ [data-hy-reveal='hidden'][data-hy-reveal-from='scale'] {
19
+ scale: 0.96;
20
+ }
21
+
22
+ @media print {
23
+ [data-hy-reveal] {
24
+ opacity: 1 !important;
25
+ translate: none !important;
26
+ scale: none !important;
27
+ }
28
+ }
29
+
30
+ .hy-tilt {
31
+ transform: perspective(900px) rotateX(var(--hy-rx, 0deg)) rotateY(var(--hy-ry, 0deg));
32
+ transform-style: preserve-3d;
33
+ transition:
34
+ transform var(--hy-dur-settle) var(--hy-ease-out),
35
+ --hy-glow var(--hy-dur-settle) var(--hy-ease-out);
36
+ }
37
+
38
+ .hy-magnetic {
39
+ translate: var(--hy-mx, 0px) var(--hy-my, 0px);
40
+ transition: translate var(--hy-dur-settle) var(--hy-ease-out);
41
+ }
42
+
43
+ /* GSAP already smooths these values, so the CSS transition would lag. */
44
+ .hy-tilt.hy-gsap {
45
+ transition: --hy-glow var(--hy-dur-settle) var(--hy-ease-out);
46
+ }
47
+
48
+ .hy-magnetic.hy-gsap {
49
+ transition: none;
50
+ }
51
+
52
+ .hy-ripple-host {
53
+ position: relative;
54
+ overflow: hidden;
55
+ isolation: isolate;
56
+ }
57
+
58
+ .hy-ripple {
59
+ position: absolute;
60
+ /* Pointer coordinates are physical, so the ripple is placed physically. */
61
+ top: calc(var(--hy-ripple-y) - var(--hy-ripple-size) / 2);
62
+ left: calc(var(--hy-ripple-x) - var(--hy-ripple-size) / 2); /* physical-ok */
63
+ inline-size: var(--hy-ripple-size);
64
+ block-size: var(--hy-ripple-size);
65
+ border-radius: 50%;
66
+ background: radial-gradient(closest-side, currentColor, transparent);
67
+ opacity: 0;
68
+ pointer-events: none;
69
+ z-index: -1;
70
+ animation: hy-ripple var(--hy-dur-scene) var(--hy-ease-out);
71
+ }
72
+
73
+ @keyframes hy-ripple {
74
+ from {
75
+ scale: 0;
76
+ opacity: 0.18;
77
+ }
78
+ to {
79
+ scale: 1;
80
+ opacity: 0;
81
+ }
82
+ }
@@ -0,0 +1,55 @@
1
+ /*
2
+ * Navbar slots. Links and brand are projected content, so their styles are
3
+ * global. The collapse rule uses the navbar's container query.
4
+ */
5
+ .hy-navbar__brand {
6
+ display: inline-flex;
7
+ align-items: center;
8
+ gap: var(--hy-space-2);
9
+ color: var(--hy-ink);
10
+ font-weight: 650;
11
+ font-size: var(--hy-step-1);
12
+ text-decoration: none;
13
+ white-space: nowrap;
14
+ }
15
+
16
+ .hy-navbar__actions {
17
+ display: flex;
18
+ align-items: center;
19
+ gap: var(--hy-space-2);
20
+ }
21
+
22
+ .hy-navbar__links > a {
23
+ display: inline-flex;
24
+ align-items: center;
25
+ min-block-size: 2.25rem;
26
+ padding-inline: var(--hy-space-3);
27
+ border-radius: var(--hy-navbar-link-radius, var(--hy-radius-pill));
28
+ color: var(--hy-ink-2);
29
+ font-weight: 520;
30
+ text-decoration: none;
31
+ transition:
32
+ color var(--hy-dur-quick) var(--hy-ease-out),
33
+ background-color var(--hy-dur-quick) var(--hy-ease-out);
34
+ }
35
+
36
+ .hy-navbar__links > a:hover,
37
+ .hy-navbar__links > a[aria-current] {
38
+ color: var(--hy-ink);
39
+ background-color: color-mix(in srgb, var(--hy-ink) 7%, transparent);
40
+ }
41
+
42
+ .hy-navbar__links > a:focus-visible {
43
+ outline: none;
44
+ box-shadow: var(--hy-focus-ring);
45
+ }
46
+
47
+ @container hy-navbar (max-width: 48rem) {
48
+ .hy-navbar__actions {
49
+ margin-inline-start: auto;
50
+ }
51
+
52
+ .hy-navbar__links > a {
53
+ min-block-size: 2.75rem;
54
+ }
55
+ }
@@ -0,0 +1,27 @@
1
+ /* Tooltip and popover panels. Their enter and exit live in presence.css. */
2
+
3
+ .hy-tooltip {
4
+ display: block;
5
+ max-inline-size: 18rem;
6
+ padding: var(--hy-space-1) var(--hy-space-3);
7
+ border-radius: var(--hy-tooltip-radius, var(--hy-radius-s));
8
+ background: var(--hy-tooltip-bg, color-mix(in srgb, var(--hy-ink) 92%, transparent));
9
+ color: var(--hy-tooltip-ink, var(--hy-bg));
10
+ font-size: var(--hy-step--1);
11
+ letter-spacing: var(--hy-tracking-small);
12
+ line-height: 1.4;
13
+ box-shadow: 0 6px 20px -8px rgb(0 0 0 / 0.4);
14
+ }
15
+
16
+ .hy-tooltip-pane {
17
+ z-index: var(--hy-z-tooltip);
18
+ }
19
+
20
+ .hy-popover {
21
+ min-inline-size: 12rem;
22
+ max-inline-size: min(22rem, 100vw - 1.5rem);
23
+ padding: var(--hy-popover-padding, var(--hy-space-4));
24
+ border-radius: var(--hy-popover-radius, var(--hy-radius-m));
25
+ color: var(--hy-ink);
26
+ outline: none;
27
+ }
@@ -0,0 +1,55 @@
1
+ /*
2
+ * Tooltip, popover and select panels render in CDK overlays. They enter and
3
+ * leave through data-state (see HyPresence): `closed` and `closing` are the
4
+ * hidden pose, `open` the shown one. CDK sets transform-origin on each panel
5
+ * to the side that faces its trigger, so the scale grows out of the trigger.
6
+ *
7
+ * Transitions rather than keyframes, so a panel reopened mid-exit turns
8
+ * around from where it is. With reduced motion only the fade is left.
9
+ */
10
+ :is(.hy-tooltip, .hy-popover, .hy-select__panel) {
11
+ transition:
12
+ opacity var(--hy-dur-enter) var(--hy-ease-out),
13
+ scale var(--hy-dur-enter) var(--hy-ease-out);
14
+ }
15
+
16
+ :is(.hy-tooltip, .hy-popover, .hy-select__panel):is([data-state='closed'], [data-state='closing']) {
17
+ opacity: 0;
18
+ scale: calc(1 - 0.06 * var(--hy-move));
19
+ }
20
+
21
+ :is(.hy-popover, .hy-select__panel) {
22
+ transition:
23
+ opacity var(--hy-dur-enter) var(--hy-ease-out),
24
+ scale var(--hy-dur-enter) var(--hy-ease-out),
25
+ backdrop-filter var(--hy-dur-enter) var(--hy-ease-out),
26
+ -webkit-backdrop-filter var(--hy-dur-enter) var(--hy-ease-out);
27
+ }
28
+
29
+ /* The glass materialises: the blur grows in with the panel. */
30
+ :is(.hy-popover, .hy-select__panel):is([data-state='closed'], [data-state='closing']) {
31
+ backdrop-filter: blur(0) saturate(100%);
32
+ -webkit-backdrop-filter: blur(0) saturate(100%);
33
+ }
34
+
35
+ /*
36
+ * CDK can attach a panel before its overlay is rendered, so the closed pose
37
+ * set first is never seen. The starting style gives the open state a pose
38
+ * to transition from on its first frame.
39
+ */
40
+ @starting-style {
41
+ :is(.hy-tooltip, .hy-popover, .hy-select__panel)[data-state='open'] {
42
+ opacity: 0;
43
+ scale: calc(1 - 0.06 * var(--hy-move));
44
+ }
45
+
46
+ :is(.hy-popover, .hy-select__panel)[data-state='open'] {
47
+ backdrop-filter: blur(0) saturate(100%);
48
+ -webkit-backdrop-filter: blur(0) saturate(100%);
49
+ }
50
+ }
51
+
52
+ :is(.hy-tooltip, .hy-popover, .hy-select__panel)[data-state='closing'] {
53
+ transition-duration: var(--hy-dur-exit);
54
+ transition-timing-function: var(--hy-ease-inout);
55
+ }
@@ -0,0 +1,42 @@
1
+ /* A small reset. It sits in the lowest layer so any app style wins over it. */
2
+ *,
3
+ *::before,
4
+ *::after {
5
+ box-sizing: border-box;
6
+ }
7
+
8
+ body {
9
+ margin: 0;
10
+ background: var(--hy-bg);
11
+ color: var(--hy-ink);
12
+ font-family: var(--hy-font-body);
13
+ font-size: var(--hy-step-0);
14
+ line-height: var(--hy-leading);
15
+ -webkit-font-smoothing: antialiased;
16
+ text-rendering: optimizeLegibility;
17
+ }
18
+
19
+ :where(h1, h2, h3, h4, h5, h6) {
20
+ font-family: var(--hy-font-display);
21
+ line-height: var(--hy-leading-tight);
22
+ text-wrap: balance;
23
+ }
24
+
25
+ :where(p) {
26
+ text-wrap: pretty;
27
+ }
28
+
29
+ :where(img, svg, video, canvas) {
30
+ display: block;
31
+ max-inline-size: 100%;
32
+ }
33
+
34
+ :where(button, input, select, textarea) {
35
+ font: inherit;
36
+ color: inherit;
37
+ }
38
+
39
+ :where(:focus-visible) {
40
+ outline: 2px solid var(--hy-primary);
41
+ outline-offset: 2px;
42
+ }
@@ -0,0 +1,46 @@
1
+ /* The select dropdown renders in a CDK overlay, outside the component. */
2
+ .hy-select__panel {
3
+ /* The pane is a flex row sized to the trigger; fill it. */
4
+ flex: 1;
5
+ max-block-size: min(20rem, 60vh);
6
+ overflow-y: auto;
7
+ padding: var(--hy-space-1);
8
+ border-radius: var(--hy-select-panel-radius, var(--hy-radius-m));
9
+ outline: none;
10
+ }
11
+
12
+ .hy-select__option {
13
+ display: flex;
14
+ align-items: center;
15
+ justify-content: space-between;
16
+ gap: var(--hy-space-3);
17
+ min-block-size: 2.5rem;
18
+ padding-inline: var(--hy-space-3);
19
+ border-radius: var(--hy-select-option-radius, var(--hy-radius-s));
20
+ color: var(--hy-ink);
21
+ cursor: pointer;
22
+ }
23
+
24
+ .hy-select__option[data-active='true'] {
25
+ background: color-mix(in srgb, var(--hy-ink) 8%, transparent);
26
+ outline: 2px solid var(--hy-primary);
27
+ outline-offset: -2px;
28
+ }
29
+
30
+ .hy-select__option[aria-selected='true'] {
31
+ font-weight: 600;
32
+ }
33
+
34
+ .hy-select__check {
35
+ visibility: hidden;
36
+ color: var(--hy-primary);
37
+ }
38
+
39
+ .hy-select__option[aria-selected='true'] .hy-select__check {
40
+ visibility: visible;
41
+ }
42
+
43
+ .hy-select__option[aria-disabled='true'] {
44
+ opacity: 0.45;
45
+ cursor: not-allowed;
46
+ }
@@ -0,0 +1,105 @@
1
+ /*
2
+ * Dark theme ("obsidian"). Set data-hy-theme="dark" on <html> to force it,
3
+ * data-hy-theme="light" to opt out, or leave it unset to follow the OS.
4
+ * The same values are repeated for both selectors because CSS has no mixins.
5
+ */
6
+ :root {
7
+ color-scheme: light;
8
+ }
9
+
10
+ :root[data-hy-theme='dark'],
11
+ .hy-theme-dark {
12
+ color-scheme: dark;
13
+ --hy-bg: #0a0c11;
14
+ --hy-surface-1: #13161d;
15
+ --hy-surface-2: #1a1e26;
16
+ --hy-surface-3: #222731;
17
+ --hy-surface-4: #2c323e;
18
+ --hy-ink: #eef1f6;
19
+ --hy-ink-2: #b9c2ce;
20
+ --hy-ink-3: #8f99a8;
21
+ --hy-ink-2-glass: #cdd4de;
22
+ --hy-ink-3-glass: #a7b1be;
23
+ --hy-line: rgb(238 241 246 / 0.12);
24
+ --hy-line-strong: rgb(238 241 246 / 0.26);
25
+ --hy-primary: #8e9cff;
26
+ --hy-primary-hover: #a5b0ff;
27
+ --hy-primary-ink: #0a0c11;
28
+ --hy-primary-wash: rgb(142 156 255 / 0.16);
29
+ --hy-success: #4fd1a5;
30
+ --hy-success-wash: rgb(79 209 165 / 0.14);
31
+ --hy-warning: #f2b45a;
32
+ --hy-warning-wash: rgb(242 180 90 / 0.14);
33
+ --hy-danger: #ff7a70;
34
+ --hy-danger-ink: #0a0c11;
35
+ --hy-danger-wash: rgb(255 122 112 / 0.15);
36
+ --hy-scrim: rgb(0 0 0 / 0.55);
37
+ --hy-glass-tint: 255 255 255;
38
+ --hy-glass-fill-top: 0.12;
39
+ --hy-glass-fill-bottom: 0.06;
40
+ --hy-glass-edge: inset 0 1px 0 rgb(255 255 255 / 0.16), inset 0 0 0 1px rgb(255 255 255 / 0.07);
41
+ --hy-glass-border: rgb(255 255 255 / 0.08);
42
+ --hy-glass-shadow: 0 1px 2px rgb(0 0 0 / 0.3), 0 16px 40px -16px rgb(0 0 0 / 0.6);
43
+ --hy-glass-shadow-thin: 0 1px 2px rgb(0 0 0 / 0.3), 0 6px 16px -8px rgb(0 0 0 / 0.5);
44
+ --hy-glass-shadow-thick: 0 2px 4px rgb(0 0 0 / 0.3), 0 28px 72px -20px rgb(0 0 0 / 0.7);
45
+ --hy-glass-reflection: linear-gradient(
46
+ to bottom,
47
+ rgb(255 255 255 / 0.08),
48
+ rgb(255 255 255 / 0) 40%
49
+ );
50
+ }
51
+
52
+ @media (prefers-color-scheme: dark) {
53
+ :root:not([data-hy-theme='light']) {
54
+ color-scheme: dark;
55
+ --hy-bg: #0a0c11;
56
+ --hy-surface-1: #13161d;
57
+ --hy-surface-2: #1a1e26;
58
+ --hy-surface-3: #222731;
59
+ --hy-surface-4: #2c323e;
60
+ --hy-ink: #eef1f6;
61
+ --hy-ink-2: #b9c2ce;
62
+ --hy-ink-3: #8f99a8;
63
+ --hy-ink-2-glass: #cdd4de;
64
+ --hy-ink-3-glass: #a7b1be;
65
+ --hy-line: rgb(238 241 246 / 0.12);
66
+ --hy-line-strong: rgb(238 241 246 / 0.26);
67
+ --hy-primary: #8e9cff;
68
+ --hy-primary-hover: #a5b0ff;
69
+ --hy-primary-ink: #0a0c11;
70
+ --hy-primary-wash: rgb(142 156 255 / 0.16);
71
+ --hy-success: #4fd1a5;
72
+ --hy-success-wash: rgb(79 209 165 / 0.14);
73
+ --hy-warning: #f2b45a;
74
+ --hy-warning-wash: rgb(242 180 90 / 0.14);
75
+ --hy-danger: #ff7a70;
76
+ --hy-danger-ink: #0a0c11;
77
+ --hy-danger-wash: rgb(255 122 112 / 0.15);
78
+ --hy-scrim: rgb(0 0 0 / 0.55);
79
+ --hy-glass-tint: 255 255 255;
80
+ --hy-glass-fill-top: 0.12;
81
+ --hy-glass-fill-bottom: 0.06;
82
+ --hy-glass-edge: inset 0 1px 0 rgb(255 255 255 / 0.16), inset 0 0 0 1px rgb(255 255 255 / 0.07);
83
+ --hy-glass-border: rgb(255 255 255 / 0.08);
84
+ --hy-glass-shadow: 0 1px 2px rgb(0 0 0 / 0.3), 0 16px 40px -16px rgb(0 0 0 / 0.6);
85
+ --hy-glass-shadow-thin: 0 1px 2px rgb(0 0 0 / 0.3), 0 6px 16px -8px rgb(0 0 0 / 0.5);
86
+ --hy-glass-shadow-thick: 0 2px 4px rgb(0 0 0 / 0.3), 0 28px 72px -20px rgb(0 0 0 / 0.7);
87
+ --hy-glass-reflection: linear-gradient(
88
+ to bottom,
89
+ rgb(255 255 255 / 0.08),
90
+ rgb(255 255 255 / 0) 40%
91
+ );
92
+ }
93
+ }
94
+
95
+ /*
96
+ * Higher contrast: stronger lines, no see-through surfaces. The selector has
97
+ * the same weight as the dark theme selectors above, so it wins in both themes.
98
+ */
99
+ @media (prefers-contrast: more) {
100
+ :root:is([data-hy-theme], :not([data-hy-theme])),
101
+ .hy-theme-dark {
102
+ --hy-line: var(--hy-line-strong);
103
+ --hy-ink-3: var(--hy-ink-2);
104
+ }
105
+ }