sid-ui 0.0.0-stage → 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.
Files changed (122) hide show
  1. package/README.md +54 -2
  2. package/package.json +51 -4
  3. package/src/brand/BrandFooter.tsx +45 -0
  4. package/src/brand/BrandHeading.tsx +24 -0
  5. package/src/brand/BrandLockup.tsx +47 -0
  6. package/src/brand/JoinedLogo.tsx +67 -0
  7. package/src/brand/JoinedMark.tsx +76 -0
  8. package/src/brand/geometry.ts +26 -0
  9. package/src/brand/index.ts +11 -0
  10. package/src/brand/name.ts +5 -0
  11. package/src/brand/paint.tsx +56 -0
  12. package/src/components/Action.tsx +44 -0
  13. package/src/components/AddressSelector.tsx +99 -0
  14. package/src/components/BarChart.tsx +132 -0
  15. package/src/components/Calendar.tsx +284 -0
  16. package/src/components/CalendarAgenda.tsx +87 -0
  17. package/src/components/CalendarMonth.tsx +223 -0
  18. package/src/components/CalendarSchedule.tsx +210 -0
  19. package/src/components/Card.tsx +80 -0
  20. package/src/components/Charts.tsx +64 -0
  21. package/src/components/Chat.tsx +35 -0
  22. package/src/components/CitySelector.tsx +81 -0
  23. package/src/components/Clock.tsx +196 -0
  24. package/src/components/CodeInput.tsx +183 -0
  25. package/src/components/Container.tsx +20 -0
  26. package/src/components/Content.tsx +50 -0
  27. package/src/components/Data.tsx +43 -0
  28. package/src/components/DataInput.tsx +107 -0
  29. package/src/components/DateField.tsx +162 -0
  30. package/src/components/DonutChart.tsx +123 -0
  31. package/src/components/Drawer.tsx +110 -0
  32. package/src/components/Feedback.tsx +37 -0
  33. package/src/components/FileUploader.tsx +377 -0
  34. package/src/components/FunnelChart.tsx +83 -0
  35. package/src/components/Glyph.tsx +330 -0
  36. package/src/components/GoogleSignIn.tsx +67 -0
  37. package/src/components/GridSystem.tsx +131 -0
  38. package/src/components/HeatmapCalendar.tsx +167 -0
  39. package/src/components/KanbanBoard.tsx +421 -0
  40. package/src/components/Kpi.tsx +61 -0
  41. package/src/components/LayoutPrimitives.tsx +86 -0
  42. package/src/components/Lists.tsx +19 -0
  43. package/src/components/LocationSelector.tsx +49 -0
  44. package/src/components/MessageList.tsx +80 -0
  45. package/src/components/Nav.tsx +69 -0
  46. package/src/components/Navigation.tsx +52 -0
  47. package/src/components/Notification.tsx +115 -0
  48. package/src/components/NotificationTrigger.tsx +248 -0
  49. package/src/components/Overlay.tsx +50 -0
  50. package/src/components/Page.tsx +143 -0
  51. package/src/components/PageTabs.tsx +28 -0
  52. package/src/components/PickerShell.tsx +138 -0
  53. package/src/components/PillNav.tsx +194 -0
  54. package/src/components/Primitives.tsx +30 -0
  55. package/src/components/Rating.tsx +78 -0
  56. package/src/components/Responsive.tsx +128 -0
  57. package/src/components/ResponsiveFrame.tsx +122 -0
  58. package/src/components/Segment.tsx +190 -0
  59. package/src/components/Sparkline.tsx +52 -0
  60. package/src/components/StateSelector.tsx +39 -0
  61. package/src/components/Sticky.tsx +95 -0
  62. package/src/components/Table.tsx +344 -0
  63. package/src/components/ThemeToggle.tsx +48 -0
  64. package/src/components/Tile.tsx +23 -0
  65. package/src/components/TimeColumns.tsx +155 -0
  66. package/src/components/TimeDial.tsx +260 -0
  67. package/src/components/TimeField.tsx +196 -0
  68. package/src/components/TimeInput.tsx +213 -0
  69. package/src/components/TimeSlots.tsx +83 -0
  70. package/src/components/Timeline.tsx +111 -0
  71. package/src/components/TokenDemo.tsx +378 -0
  72. package/src/components/Tree.tsx +283 -0
  73. package/src/components/TrendChart.tsx +211 -0
  74. package/src/components/breakpoints.ts +42 -0
  75. package/src/components/calendarTypes.ts +26 -0
  76. package/src/components/chartMath.ts +125 -0
  77. package/src/components/chartParts.tsx +116 -0
  78. package/src/components/codeInputRules.ts +58 -0
  79. package/src/components/date.ts +87 -0
  80. package/src/components/hooks.ts +53 -0
  81. package/src/components/index.ts +195 -0
  82. package/src/components/kanban.ts +78 -0
  83. package/src/components/motion.ts +78 -0
  84. package/src/components/places-search.tsx +73 -0
  85. package/src/components/places.ts +209 -0
  86. package/src/components/size.ts +3 -0
  87. package/src/components/time.ts +83 -0
  88. package/src/components/useFileDrop.ts +104 -0
  89. package/src/places/geoapify.ts +129 -0
  90. package/src/styles/astryx.css +5 -0
  91. package/src/styles/components/brand.css +98 -0
  92. package/src/styles/components/calendar.css +680 -0
  93. package/src/styles/components/charts.css +659 -0
  94. package/src/styles/components/code-input.css +233 -0
  95. package/src/styles/components/google.css +11 -0
  96. package/src/styles/components/message-list.css +153 -0
  97. package/src/styles/components/notification.css +350 -0
  98. package/src/styles/components/picker.css +114 -0
  99. package/src/styles/components/pill-nav.css +179 -0
  100. package/src/styles/components/responsive.css +419 -0
  101. package/src/styles/components/sticky.css +23 -0
  102. package/src/styles/components/table.css +267 -0
  103. package/src/styles/components/time.css +526 -0
  104. package/src/styles/components/timeline.css +426 -0
  105. package/src/styles/components/tree.css +269 -0
  106. package/src/styles/components.css +423 -0
  107. package/src/styles/joined.css +4 -0
  108. package/src/styles/theme.css +79 -0
  109. package/src/styles/tokens.css +338 -0
  110. package/src/theme/JoinedProvider.tsx +50 -0
  111. package/src/theme/index.ts +3 -0
  112. package/src/theme/joined.d.ts +11 -0
  113. package/src/theme/joined.js +569 -0
  114. package/src/theme/joined.theme.ts +74 -0
  115. package/src/theme/joined.variants.d.ts +16 -0
  116. package/src/theme/theme.css +786 -0
  117. package/styles/astryx.css +1 -0
  118. package/styles/components.css +1 -0
  119. package/styles/joined.css +1 -0
  120. package/styles/theme.css +1 -0
  121. package/styles/tokens.css +1 -0
  122. package/styles.css +1 -0
@@ -0,0 +1,233 @@
1
+ /* CodeInput — one round cell per character. A filled cell pops in, the active cell lifts and
2
+ shows a blinking caret, a wrong code shakes once, and a right one ripples green across the row.
3
+ Motion uses only duration/ease tokens and stands down for prefers-reduced-motion. */
4
+
5
+ .os-code {
6
+ --_cell: var(--spacing-12);
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: var(--spacing-2);
10
+ max-width: 100%;
11
+ }
12
+
13
+ .os-code-sm {
14
+ --_cell: var(--spacing-10);
15
+ }
16
+
17
+ .os-code-lg {
18
+ --_cell: calc(var(--spacing-12) + var(--spacing-2));
19
+ }
20
+
21
+ .os-code-label {
22
+ font-size: var(--font-size-sm);
23
+ font-weight: var(--font-weight-medium);
24
+ color: var(--color-text-secondary);
25
+ letter-spacing: 0.01em;
26
+ }
27
+
28
+ .os-code-label-hidden {
29
+ position: absolute;
30
+ width: 1px;
31
+ height: 1px;
32
+ overflow: hidden;
33
+ clip-path: inset(50%);
34
+ white-space: nowrap;
35
+ }
36
+
37
+ .os-code-description {
38
+ font-size: var(--font-size-sm);
39
+ color: var(--color-text-secondary);
40
+ }
41
+
42
+ .os-code-cells {
43
+ display: flex;
44
+ gap: var(--spacing-2);
45
+ }
46
+
47
+ .os-code-cell {
48
+ position: relative;
49
+ flex: 0 1 auto;
50
+ width: var(--_cell);
51
+ min-width: 0;
52
+ aspect-ratio: 1;
53
+ border-radius: var(--radius-full);
54
+ background: var(--color-background-surface);
55
+ box-shadow: inset 0 0 0 1px var(--color-border-emphasized);
56
+ transition:
57
+ box-shadow var(--duration-fast) var(--ease-standard),
58
+ background-color var(--duration-fast) var(--ease-standard),
59
+ transform var(--duration-medium) var(--ease-standard);
60
+ }
61
+
62
+ .os-code-cell:hover {
63
+ box-shadow: inset 0 0 0 1px var(--color-text-disabled);
64
+ }
65
+
66
+ /* The active cell lifts slightly and takes the accent ring. */
67
+ .os-code-cell:focus-within {
68
+ background: var(--color-accent-muted);
69
+ box-shadow:
70
+ inset 0 0 0 2px var(--color-accent),
71
+ 0 var(--spacing-1) var(--spacing-3) var(--color-shadow);
72
+ transform: translateY(calc(-1 * var(--spacing-0-5))) scale(1.06);
73
+ }
74
+
75
+ /* A cell that holds a character keeps a soft accent tint, and pops each time it fills. */
76
+ .os-code-cell[data-filled="true"] {
77
+ background: var(--color-accent-muted);
78
+ box-shadow: inset 0 0 0 1px var(--color-border-blue);
79
+ animation: os-code-pop var(--duration-medium) var(--ease-standard);
80
+ }
81
+
82
+ .os-code-cell[data-filled="true"]:focus-within {
83
+ box-shadow:
84
+ inset 0 0 0 2px var(--color-accent),
85
+ 0 var(--spacing-1) var(--spacing-3) var(--color-shadow);
86
+ }
87
+
88
+ .os-code-input {
89
+ position: absolute;
90
+ inset: 0;
91
+ width: 100%;
92
+ height: 100%;
93
+ min-width: 0;
94
+ margin: 0;
95
+ padding: 0;
96
+ border: 0;
97
+ border-radius: inherit;
98
+ background: transparent;
99
+ outline: none;
100
+ color: var(--color-text-primary);
101
+ font-family: var(--font-family-body);
102
+ font-size: var(--font-size-2xl);
103
+ font-weight: var(--font-weight-semibold);
104
+ font-variant-numeric: tabular-nums;
105
+ text-align: center;
106
+ text-transform: uppercase;
107
+ caret-color: transparent;
108
+ cursor: text;
109
+ }
110
+
111
+ .os-code-sm .os-code-input {
112
+ font-size: var(--font-size-xl);
113
+ }
114
+
115
+ .os-code-lg .os-code-input {
116
+ font-size: var(--font-size-3xl);
117
+ }
118
+
119
+ /* A blinking bar stands in for the caret while an empty cell is active. */
120
+ .os-code-cell[data-filled="false"]:focus-within::after {
121
+ content: "";
122
+ position: absolute;
123
+ top: 28%;
124
+ bottom: 28%;
125
+ left: 50%;
126
+ width: var(--spacing-0-5);
127
+ border-radius: var(--radius-full);
128
+ background: var(--color-accent);
129
+ transform: translateX(-50%);
130
+ pointer-events: none;
131
+ animation: os-code-caret 1s var(--ease-standard) infinite;
132
+ }
133
+
134
+ /* Error: one shake and a red ring. */
135
+ .os-code[data-status="error"] .os-code-cell,
136
+ .os-code[data-status="error"] .os-code-cell:focus-within {
137
+ background: var(--color-error-muted);
138
+ box-shadow: inset 0 0 0 2px var(--color-error);
139
+ }
140
+
141
+ .os-code[data-status="error"] .os-code-cells {
142
+ animation: os-code-shake var(--duration-fast) var(--ease-standard) 3;
143
+ }
144
+
145
+ .os-code[data-status="error"] .os-code-input {
146
+ color: var(--color-error);
147
+ }
148
+
149
+ /* Success: green, each cell a beat after the one before. */
150
+ .os-code[data-status="success"] .os-code-cell,
151
+ .os-code[data-status="success"] .os-code-cell:focus-within {
152
+ background: var(--color-success-muted);
153
+ box-shadow: inset 0 0 0 2px var(--color-success);
154
+ transform: none;
155
+ animation: os-code-ripple var(--duration-medium) var(--ease-standard) both;
156
+ animation-delay: calc(var(--os-code-index) * var(--duration-fast));
157
+ }
158
+
159
+ .os-code[data-status="success"] .os-code-input {
160
+ color: var(--color-success);
161
+ }
162
+
163
+ .os-code-input:disabled {
164
+ cursor: not-allowed;
165
+ }
166
+
167
+ .os-code-cell:has(.os-code-input:disabled) {
168
+ opacity: 0.45;
169
+ }
170
+
171
+ @keyframes os-code-pop {
172
+ 0% {
173
+ transform: scale(0.82);
174
+ }
175
+ 60% {
176
+ transform: scale(1.12);
177
+ }
178
+ 100% {
179
+ transform: scale(1);
180
+ }
181
+ }
182
+
183
+ @keyframes os-code-caret {
184
+ 0%,
185
+ 45% {
186
+ opacity: 1;
187
+ }
188
+ 55%,
189
+ 100% {
190
+ opacity: 0;
191
+ }
192
+ }
193
+
194
+ @keyframes os-code-shake {
195
+ 0%,
196
+ 100% {
197
+ transform: translateX(0);
198
+ }
199
+ 25% {
200
+ transform: translateX(calc(-1 * var(--spacing-2)));
201
+ }
202
+ 75% {
203
+ transform: translateX(var(--spacing-2));
204
+ }
205
+ }
206
+
207
+ @keyframes os-code-ripple {
208
+ 0% {
209
+ transform: scale(1);
210
+ }
211
+ 50% {
212
+ transform: scale(1.18);
213
+ }
214
+ 100% {
215
+ transform: scale(1);
216
+ }
217
+ }
218
+
219
+ @media (prefers-reduced-motion: reduce) {
220
+ .os-code-cell,
221
+ .os-code-cells {
222
+ animation: none !important;
223
+ transition: none;
224
+ }
225
+
226
+ .os-code-cell:focus-within {
227
+ transform: none;
228
+ }
229
+
230
+ .os-code-cell[data-filled="false"]:focus-within::after {
231
+ animation: none;
232
+ }
233
+ }
@@ -0,0 +1,11 @@
1
+ /* Google's "G" in its four fixed brand colors, per Google's sign-in branding
2
+ guidelines. They are Google's, so they do not follow the Joined theme. */
3
+ .os-google-mark {
4
+ --os-google-blue: #4285f4;
5
+ --os-google-red: #ea4335;
6
+ --os-google-yellow: #fbbc05;
7
+ --os-google-green: #34a853;
8
+
9
+ display: block;
10
+ flex-shrink: 0;
11
+ }
@@ -0,0 +1,153 @@
1
+ /* MessageList — mail as one line per message, two lines in a narrow container. */
2
+
3
+ .os-mail {
4
+ container-type: inline-size;
5
+ display: flex;
6
+ min-width: 0;
7
+ flex-direction: column;
8
+ }
9
+
10
+ .os-mail-heading {
11
+ display: flex;
12
+ align-items: center;
13
+ gap: var(--spacing-2);
14
+ padding: var(--spacing-3) var(--spacing-2);
15
+ border-bottom: var(--border-width) solid var(--color-border);
16
+ color: var(--color-text-primary);
17
+ font-size: var(--font-size-base);
18
+ font-weight: var(--font-weight-semibold);
19
+ }
20
+
21
+ .os-mail-heading-icon {
22
+ display: inline-flex;
23
+ color: var(--color-icon-secondary);
24
+ font-size: var(--font-size-lg);
25
+ }
26
+
27
+ .os-mail-count {
28
+ color: var(--color-text-secondary);
29
+ font-weight: var(--font-weight-normal);
30
+ font-variant-numeric: tabular-nums;
31
+ }
32
+
33
+ .os-mail-empty {
34
+ margin: 0;
35
+ padding: var(--spacing-6) var(--spacing-2);
36
+ color: var(--color-text-secondary);
37
+ font-size: var(--font-size-sm);
38
+ }
39
+
40
+ .os-mail-list {
41
+ margin: 0;
42
+ padding: 0;
43
+ list-style: none;
44
+ }
45
+
46
+ .os-mail-list > li + li .os-mail-row {
47
+ border-top: var(--border-width) solid var(--color-border);
48
+ }
49
+
50
+ .os-mail-row {
51
+ display: grid;
52
+ width: 100%;
53
+ grid-template-columns: var(--spacing-2) minmax(0, 11rem) minmax(0, 1fr) auto minmax(
54
+ var(--spacing-12),
55
+ auto
56
+ );
57
+ gap: var(--spacing-3);
58
+ align-items: center;
59
+ padding: var(--spacing-3) var(--spacing-2);
60
+ border: 0;
61
+ border-radius: 0;
62
+ background: transparent;
63
+ color: var(--color-text-secondary);
64
+ font: inherit;
65
+ font-size: var(--font-size-base);
66
+ text-align: start;
67
+ cursor: pointer;
68
+ transition: background-color var(--duration-fast) var(--ease-standard);
69
+ }
70
+
71
+ .os-mail-row:hover {
72
+ background: var(--color-overlay-hover);
73
+ }
74
+
75
+ .os-mail-row[aria-current="true"] {
76
+ background: var(--color-accent-muted);
77
+ }
78
+
79
+ .os-mail-row:focus-visible {
80
+ outline: var(--focus-outline-width) var(--focus-outline-style) var(--focus-outline-color);
81
+ outline-offset: calc(-1 * var(--focus-outline-width));
82
+ }
83
+
84
+ .os-mail-dot {
85
+ width: var(--spacing-2);
86
+ height: var(--spacing-2);
87
+ border-radius: var(--radius-full);
88
+ }
89
+
90
+ .os-mail-row[data-unread] .os-mail-dot {
91
+ background: var(--color-accent);
92
+ }
93
+
94
+ .os-mail-sender,
95
+ .os-mail-text {
96
+ overflow: hidden;
97
+ min-width: 0;
98
+ text-overflow: ellipsis;
99
+ white-space: nowrap;
100
+ }
101
+
102
+ .os-mail-sender,
103
+ .os-mail-subject {
104
+ color: var(--color-text-primary);
105
+ }
106
+
107
+ .os-mail-row[data-unread] .os-mail-sender,
108
+ .os-mail-row[data-unread] .os-mail-subject {
109
+ font-weight: var(--font-weight-semibold);
110
+ }
111
+
112
+ .os-mail-tag {
113
+ display: inline-flex;
114
+ justify-content: flex-end;
115
+ }
116
+
117
+ .os-mail-time {
118
+ font-size: var(--font-size-sm);
119
+ font-variant-numeric: tabular-nums;
120
+ text-align: end;
121
+ white-space: nowrap;
122
+ }
123
+
124
+ @container (max-width: 560px) {
125
+ .os-mail-row {
126
+ grid-template-columns: var(--spacing-2) minmax(0, 1fr) auto;
127
+ grid-template-areas:
128
+ "dot sender time"
129
+ ". text tag";
130
+ row-gap: var(--spacing-1);
131
+ }
132
+ .os-mail-dot {
133
+ grid-area: dot;
134
+ }
135
+ .os-mail-sender {
136
+ grid-area: sender;
137
+ }
138
+ .os-mail-time {
139
+ grid-area: time;
140
+ }
141
+ .os-mail-text {
142
+ grid-area: text;
143
+ }
144
+ .os-mail-tag {
145
+ grid-area: tag;
146
+ }
147
+ }
148
+
149
+ @media (prefers-reduced-motion: reduce) {
150
+ .os-mail-row {
151
+ transition: none;
152
+ }
153
+ }