@tonycodes-ui/mortar 0.0.0-stage → 0.12.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 (107) hide show
  1. package/AGENTS.md +10 -0
  2. package/CHANGELOG.md +268 -0
  3. package/CONTRIBUTING.md +60 -0
  4. package/DESIGN.md +51 -0
  5. package/LICENSE +21 -0
  6. package/README.md +155 -2
  7. package/TESTING.md +83 -0
  8. package/baseline-policy.json +16 -0
  9. package/bin/mortar.mjs +258 -0
  10. package/catalog.json +9900 -0
  11. package/cli/audit.mjs +943 -0
  12. package/cli/data.mjs +176 -0
  13. package/cli/mcp.mjs +216 -0
  14. package/cli/migrations.mjs +128 -0
  15. package/cli/packet.mjs +267 -0
  16. package/cli/search.mjs +246 -0
  17. package/cli/tools.mjs +229 -0
  18. package/design-principles.json +30 -0
  19. package/dist/agent-data.json +1 -0
  20. package/dist/application.d.ts +340 -0
  21. package/dist/application.js +240 -0
  22. package/dist/auth.d.ts +121 -0
  23. package/dist/auth.js +97 -0
  24. package/dist/brand.d.ts +69 -0
  25. package/dist/brand.js +266 -0
  26. package/dist/calendar.d.ts +75 -0
  27. package/dist/calendar.js +310 -0
  28. package/dist/choice.d.ts +36 -0
  29. package/dist/choice.js +36 -0
  30. package/dist/composer.d.ts +28 -0
  31. package/dist/composer.js +47 -0
  32. package/dist/display.d.ts +136 -0
  33. package/dist/display.js +75 -0
  34. package/dist/docs.d.ts +145 -0
  35. package/dist/docs.js +141 -0
  36. package/dist/ecommerce.d.ts +261 -0
  37. package/dist/ecommerce.js +177 -0
  38. package/dist/feedback.d.ts +80 -0
  39. package/dist/feedback.js +98 -0
  40. package/dist/foundation.d.ts +42 -0
  41. package/dist/foundation.js +121 -0
  42. package/dist/heading.d.ts +5 -0
  43. package/dist/heading.js +9 -0
  44. package/dist/icons.d.ts +50 -0
  45. package/dist/icons.js +70 -0
  46. package/dist/illustration.d.ts +47 -0
  47. package/dist/illustration.js +47 -0
  48. package/dist/index.d.ts +36 -0
  49. package/dist/index.js +18 -0
  50. package/dist/inspection.d.ts +24 -0
  51. package/dist/inspection.js +14 -0
  52. package/dist/internal.d.ts +514 -0
  53. package/dist/internal.js +332 -0
  54. package/dist/layout.d.ts +107 -0
  55. package/dist/layout.js +66 -0
  56. package/dist/marketing-sections.d.ts +161 -0
  57. package/dist/marketing-sections.js +58 -0
  58. package/dist/marketing.d.ts +277 -0
  59. package/dist/marketing.js +163 -0
  60. package/dist/navigation.d.ts +35 -0
  61. package/dist/navigation.js +44 -0
  62. package/dist/primitives.d.ts +258 -0
  63. package/dist/primitives.js +244 -0
  64. package/dist/showcase.d.ts +29 -0
  65. package/dist/showcase.js +10 -0
  66. package/dist/workspace.d.ts +80 -0
  67. package/dist/workspace.js +48 -0
  68. package/docs/agents.md +127 -0
  69. package/docs/auth-flows.md +71 -0
  70. package/docs/migrating-to-0.6.md +94 -0
  71. package/docs/theming.md +170 -0
  72. package/package.json +94 -4
  73. package/skills/mortar/SKILL.md +36 -0
  74. package/src/application.css +1487 -0
  75. package/src/application.tsx +1413 -0
  76. package/src/auth.tsx +452 -0
  77. package/src/brand.ts +335 -0
  78. package/src/calendar.css +468 -0
  79. package/src/calendar.tsx +868 -0
  80. package/src/choice.tsx +240 -0
  81. package/src/composer.tsx +158 -0
  82. package/src/data.css +690 -0
  83. package/src/display.tsx +452 -0
  84. package/src/docs.css +704 -0
  85. package/src/docs.tsx +737 -0
  86. package/src/ecommerce.css +810 -0
  87. package/src/ecommerce.tsx +1033 -0
  88. package/src/feedback.tsx +388 -0
  89. package/src/foundation.css +1867 -0
  90. package/src/foundation.tsx +227 -0
  91. package/src/heading.ts +13 -0
  92. package/src/icons.tsx +237 -0
  93. package/src/illustration.tsx +169 -0
  94. package/src/index.ts +233 -0
  95. package/src/inspection.tsx +91 -0
  96. package/src/internal.tsx +700 -0
  97. package/src/layout.tsx +342 -0
  98. package/src/marketing-sections.tsx +621 -0
  99. package/src/marketing.css +2579 -0
  100. package/src/marketing.tsx +1235 -0
  101. package/src/navigation.tsx +118 -0
  102. package/src/overlays.css +350 -0
  103. package/src/primitives.tsx +1135 -0
  104. package/src/showcase.tsx +120 -0
  105. package/src/tokens.css +449 -0
  106. package/src/workspace.tsx +333 -0
  107. package/styles.css +56 -0
@@ -0,0 +1,468 @@
1
+ /* Calendar: month, week, day, year and agenda views.
2
+ Every rule sits in @layer components, so equal-specificity rules resolve by source
3
+ order. styles.css loads tokens, foundation, overlays, application, data, calendar,
4
+ marketing, docs and ecommerce in that order; inside a file each component keeps
5
+ one section, ordered base, then variants and states, then media and container
6
+ queries, except where that would change which equal-specificity rule wins. */
7
+ @layer components {
8
+ /* == Calendar == */
9
+ .m-calendar {
10
+ container: m-calendar / inline-size;
11
+ min-width: 0;
12
+ }
13
+ .m-calendar-header {
14
+ display: flex;
15
+ flex-wrap: wrap;
16
+ align-items: center;
17
+ justify-content: space-between;
18
+ gap: 8px 12px;
19
+ margin-bottom: 12px;
20
+ }
21
+ .m-calendar-header > .m-calendar-title {
22
+ flex: 1 1 auto;
23
+ }
24
+ .m-calendar-title {
25
+ margin: 0;
26
+ font-size: 15px;
27
+ font-weight: var(--m-weight-semibold);
28
+ }
29
+ .m-calendar-nav {
30
+ display: flex;
31
+ gap: 4px;
32
+ --m-icon-size: 18px;
33
+ }
34
+ .m-calendar table {
35
+ width: 100%;
36
+ border-collapse: collapse;
37
+ table-layout: fixed;
38
+ }
39
+ .m-calendar th {
40
+ padding: 4px 0 8px;
41
+ color: var(--m-muted);
42
+ font-size: 12px;
43
+ font-weight: var(--m-weight-semibold);
44
+ text-align: center;
45
+ }
46
+ .m-calendar td {
47
+ padding: 2px 0;
48
+ text-align: center;
49
+ }
50
+ .m-calendar td > button {
51
+ position: relative;
52
+ display: inline-grid;
53
+ place-items: center;
54
+ width: 36px;
55
+ height: 36px;
56
+ border-radius: 50%;
57
+ color: var(--m-ink);
58
+ font-size: var(--m-font-size);
59
+ font-variant-numeric: tabular-nums;
60
+ min-width: var(--m-touch-target);
61
+ min-height: var(--m-touch-target);
62
+ }
63
+ .m-calendar-dot {
64
+ position: absolute;
65
+ bottom: 4px;
66
+ left: 50%;
67
+ width: 4px;
68
+ height: 4px;
69
+ border-radius: 50%;
70
+ background: currentColor;
71
+ transform: translateX(-50%);
72
+ }
73
+ .m-calendar-events {
74
+ margin: 4px 0 0;
75
+ font-size: 12px;
76
+ line-height: 1.35;
77
+ }
78
+ .m-calendar-events li {
79
+ overflow: hidden;
80
+ color: var(--m-ink);
81
+ text-overflow: ellipsis;
82
+ white-space: nowrap;
83
+ }
84
+ .m-calendar-events time {
85
+ color: var(--m-muted);
86
+ }
87
+ .m-calendar-events .m-calendar-more {
88
+ color: var(--m-muted);
89
+ }
90
+ .m-calendar-timegrid {
91
+ display: grid;
92
+ grid-template-columns: 56px repeat(var(--m-days), minmax(0, 1fr));
93
+ grid-template-rows: auto auto auto;
94
+ overflow: hidden;
95
+ }
96
+ .m-calendar-columns {
97
+ display: contents;
98
+ }
99
+ .m-calendar-hours {
100
+ grid-column: 1;
101
+ grid-row: 3;
102
+ display: grid;
103
+ grid-auto-rows: var(--m-hour);
104
+ border-right: 1px solid var(--m-line);
105
+ color: var(--m-muted);
106
+ font-size: 11px;
107
+ font-variant-numeric: tabular-nums;
108
+ }
109
+ .m-calendar-hours span {
110
+ padding: 2px 8px 0 0;
111
+ text-align: end;
112
+ transform: translateY(-8px);
113
+ }
114
+ .m-calendar-hours span:first-child {
115
+ transform: none;
116
+ }
117
+ .m-calendar-column {
118
+ grid-row: 1 / -1;
119
+ display: grid;
120
+ grid-template-rows: subgrid;
121
+ min-width: 0;
122
+ border-left: 1px solid var(--m-line);
123
+ }
124
+ .m-calendar-column:first-child {
125
+ border-left: 0;
126
+ }
127
+ .m-calendar-column-heading {
128
+ grid-row: 1;
129
+ margin: 0;
130
+ padding: 10px 6px;
131
+ border-bottom: 1px solid var(--m-line);
132
+ text-align: center;
133
+ font-size: 12px;
134
+ font-weight: var(--m-weight-medium);
135
+ }
136
+ .m-calendar-column-label {
137
+ display: inline-flex;
138
+ flex-direction: column;
139
+ align-items: center;
140
+ gap: 2px;
141
+ color: var(--m-secondary);
142
+ }
143
+ .m-calendar-column-label strong {
144
+ display: inline-grid;
145
+ place-items: center;
146
+ min-width: 28px;
147
+ height: 28px;
148
+ border-radius: 50%;
149
+ color: var(--m-ink);
150
+ font-size: 15px;
151
+ font-weight: var(--m-weight-semibold);
152
+ }
153
+ .m-calendar-allday {
154
+ grid-row: 2;
155
+ display: grid;
156
+ gap: 2px;
157
+ padding: 4px;
158
+ border-bottom: 1px solid var(--m-line);
159
+ font-size: 12px;
160
+ }
161
+ .m-calendar-allday li {
162
+ overflow: hidden;
163
+ padding: 2px 6px;
164
+ border-radius: var(--m-radius-sm);
165
+ background: var(--m-sunken);
166
+ color: var(--m-ink);
167
+ text-overflow: ellipsis;
168
+ white-space: nowrap;
169
+ }
170
+ .m-calendar-slots,
171
+ .m-calendar-none {
172
+ grid-row: 3;
173
+ }
174
+ .m-calendar-slots {
175
+ position: relative;
176
+ height: calc(var(--m-hours) * var(--m-hour));
177
+ background: repeating-linear-gradient(
178
+ to bottom,
179
+ transparent 0 calc(var(--m-hour) - 1px),
180
+ var(--m-line) calc(var(--m-hour) - 1px) var(--m-hour)
181
+ );
182
+ }
183
+ .m-calendar-column > .m-calendar-none {
184
+ height: calc(var(--m-hours) * var(--m-hour));
185
+ margin: 0;
186
+ background: repeating-linear-gradient(
187
+ to bottom,
188
+ transparent 0 calc(var(--m-hour) - 1px),
189
+ var(--m-line) calc(var(--m-hour) - 1px) var(--m-hour)
190
+ );
191
+ color: transparent;
192
+ font-size: 0;
193
+ }
194
+ .m-calendar-slots > li {
195
+ position: absolute;
196
+ top: var(--m-top);
197
+ left: calc(var(--m-lane) / var(--m-lanes) * 100%);
198
+ width: calc(100% / var(--m-lanes));
199
+ height: var(--m-height);
200
+ min-height: 22px;
201
+ padding: 1px 2px;
202
+ }
203
+ .m-calendar-event {
204
+ display: flex;
205
+ flex-direction: column;
206
+ width: 100%;
207
+ height: 100%;
208
+ overflow: hidden;
209
+ padding: 4px 6px;
210
+ border: 0;
211
+ border-left: 3px solid var(--m-primary);
212
+ border-radius: var(--m-radius-sm);
213
+ background: var(--m-selected);
214
+ color: var(--m-ink);
215
+ font: inherit;
216
+ font-size: 12px;
217
+ font-weight: var(--m-weight-semibold);
218
+ line-height: 1.3;
219
+ text-align: start;
220
+ }
221
+ button.m-calendar-event {
222
+ cursor: pointer;
223
+ }
224
+ .m-calendar-event-time {
225
+ color: var(--m-muted);
226
+ font-weight: var(--m-weight-regular);
227
+ font-variant-numeric: tabular-nums;
228
+ }
229
+ .m-calendar-year {
230
+ display: grid;
231
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 220px), 1fr));
232
+ gap: 28px 24px;
233
+ }
234
+ .m-calendar-month {
235
+ min-width: 0;
236
+ }
237
+ .m-calendar-month-title {
238
+ margin: 0 0 8px;
239
+ color: var(--m-ink);
240
+ font-size: 13px;
241
+ font-weight: var(--m-weight-semibold);
242
+ }
243
+ .m-calendar-main,
244
+ .m-calendar-agenda {
245
+ flex: 1 1 100%;
246
+ min-width: 0;
247
+ }
248
+ .m-calendar-agenda {
249
+ padding-top: 20px;
250
+ border-top: 1px solid var(--m-line);
251
+ }
252
+ .m-calendar-agenda-title {
253
+ margin: 0 0 12px;
254
+ font-size: 15px;
255
+ font-weight: var(--m-weight-semibold);
256
+ }
257
+ .m-calendar-agenda-list {
258
+ display: grid;
259
+ gap: 4px;
260
+ margin: 0;
261
+ padding: 0;
262
+ list-style: none;
263
+ }
264
+ .m-calendar-agenda-list > li {
265
+ display: flex;
266
+ align-items: center;
267
+ gap: 12px;
268
+ padding: 8px 12px;
269
+ border-radius: var(--m-radius-lg);
270
+ }
271
+ .m-calendar-agenda-text {
272
+ display: grid;
273
+ flex: 1;
274
+ gap: 2px;
275
+ min-width: 0;
276
+ margin: 0;
277
+ padding: 0;
278
+ border: 0;
279
+ background: none;
280
+ color: var(--m-ink);
281
+ font: inherit;
282
+ font-size: var(--m-font-size);
283
+ text-align: start;
284
+ }
285
+ .m-calendar-agenda-text strong {
286
+ font-weight: var(--m-weight-semibold);
287
+ }
288
+ .m-calendar-agenda-text .m-calendar-event-time {
289
+ font-size: 13px;
290
+ }
291
+ button.m-calendar-agenda-text {
292
+ cursor: pointer;
293
+ }
294
+ .m-calendar-agenda > .m-calendar-none {
295
+ margin: 0;
296
+ color: var(--m-muted);
297
+ font-size: var(--m-font-size);
298
+ }
299
+ .m-calendar td > button:hover {
300
+ background: var(--m-sunken);
301
+ }
302
+ .m-calendar td[data-outside] > button {
303
+ color: var(--m-muted);
304
+ }
305
+ .m-calendar td > button[aria-current="date"] {
306
+ font-weight: var(--m-weight-bold);
307
+ box-shadow: inset 0 0 0 1px var(--m-line-strong);
308
+ }
309
+ .m-calendar td[aria-selected="true"] > button {
310
+ background: var(--m-primary);
311
+ color: var(--m-on-primary);
312
+ font-weight: var(--m-weight-semibold);
313
+ }
314
+ .m-calendar[data-variant="full"] table {
315
+ border: 1px solid var(--m-line);
316
+ }
317
+ .m-calendar[data-variant="full"] th {
318
+ padding: 8px 0;
319
+ border-bottom: 1px solid var(--m-line);
320
+ background: var(--m-sunken);
321
+ }
322
+ .m-calendar[data-variant="full"] td {
323
+ height: 104px;
324
+ padding: 6px;
325
+ border: 1px solid var(--m-line);
326
+ text-align: start;
327
+ vertical-align: top;
328
+ }
329
+ .m-calendar[data-variant="full"] td[data-outside] {
330
+ background: var(--m-sunken);
331
+ }
332
+ .m-calendar[data-variant="full"] td > button {
333
+ width: 28px;
334
+ height: 28px;
335
+ font-size: 13px;
336
+ }
337
+ .m-calendar[data-variant="full"] .m-calendar-dot {
338
+ display: none;
339
+ }
340
+ .m-calendar[data-view] {
341
+ --m-hour: 48px;
342
+ }
343
+ .m-calendar-column-heading[aria-current="date"] strong {
344
+ background: var(--m-primary);
345
+ color: var(--m-on-primary);
346
+ }
347
+ .m-calendar-column[data-selected] .m-calendar-column-heading {
348
+ background: var(--m-sunken);
349
+ }
350
+ button.m-calendar-event:hover {
351
+ background: var(--m-sunken);
352
+ }
353
+ .m-calendar[data-view="year"] th {
354
+ padding: 0 0 4px;
355
+ font-size: 11px;
356
+ }
357
+ .m-calendar[data-view="year"] td > button {
358
+ width: 30px;
359
+ height: 30px;
360
+ font-size: 12px;
361
+ }
362
+ .m-calendar[data-view="year"] td > button[aria-pressed="true"] {
363
+ background: var(--m-primary);
364
+ color: var(--m-on-primary);
365
+ font-weight: var(--m-weight-semibold);
366
+ }
367
+ .m-calendar[data-view="year"] .m-calendar-dot {
368
+ bottom: 3px;
369
+ width: 3px;
370
+ height: 3px;
371
+ }
372
+ .m-calendar-slots > li[data-clipped-start] > .m-calendar-event {
373
+ border-top: 2px dashed var(--m-line-strong);
374
+ border-start-start-radius: 0;
375
+ border-start-end-radius: 0;
376
+ }
377
+ .m-calendar-slots > li[data-clipped-end] > .m-calendar-event {
378
+ border-bottom: 2px dashed var(--m-line-strong);
379
+ border-end-start-radius: 0;
380
+ border-end-end-radius: 0;
381
+ }
382
+ .m-calendar[data-agenda] {
383
+ display: flex;
384
+ flex-wrap: wrap;
385
+ gap: 24px 48px;
386
+ }
387
+ .m-calendar-agenda-list > li:hover {
388
+ background: var(--m-sunken);
389
+ }
390
+ /* Narrow full calendars fall back to dots; titles stay available via aria-describedby. */
391
+ @container m-calendar (max-width: 560px) {
392
+ .m-calendar[data-variant="full"] td {
393
+ height: 56px;
394
+ padding: 4px 2px;
395
+ text-align: center;
396
+ }
397
+ }
398
+ .m-calendar[data-view="year"] td {
399
+ padding: 1px 0;
400
+ }
401
+ @container m-calendar (max-width: 560px) {
402
+ .m-calendar[data-variant="full"] .m-calendar-events {
403
+ display: none;
404
+ }
405
+ .m-calendar[data-variant="full"] .m-calendar-dot {
406
+ display: block;
407
+ }
408
+ }
409
+ /* Narrow containers: the same sections read as a day-by-day agenda. */
410
+ @container m-calendar (max-width: 640px) {
411
+ .m-calendar[data-view="week"] .m-calendar-timegrid {
412
+ display: block;
413
+ }
414
+ .m-calendar[data-view="week"] .m-calendar-hours {
415
+ display: none;
416
+ }
417
+ .m-calendar[data-view="week"] .m-calendar-column {
418
+ display: block;
419
+ border-left: 0;
420
+ border-bottom: 1px solid var(--m-line);
421
+ }
422
+ .m-calendar[data-view="week"] .m-calendar-column:last-child {
423
+ border-bottom: 0;
424
+ }
425
+ .m-calendar[data-view="week"] .m-calendar-column-heading {
426
+ border-bottom: 0;
427
+ text-align: start;
428
+ }
429
+ .m-calendar[data-view="week"] .m-calendar-column-label {
430
+ flex-direction: row;
431
+ gap: 8px;
432
+ }
433
+ .m-calendar[data-view="week"] :is(.m-calendar-slots, .m-calendar-allday) {
434
+ height: auto;
435
+ padding: 0 12px 12px;
436
+ border-bottom: 0;
437
+ background: none;
438
+ }
439
+ .m-calendar[data-view="week"] .m-calendar-slots > li {
440
+ position: static;
441
+ width: auto;
442
+ height: auto;
443
+ padding: 2px 0;
444
+ }
445
+ .m-calendar[data-view="week"] .m-calendar-event {
446
+ flex-direction: row;
447
+ justify-content: space-between;
448
+ gap: 12px;
449
+ }
450
+ .m-calendar[data-view="week"] .m-calendar-column > .m-calendar-none {
451
+ height: auto;
452
+ padding: 0 12px 12px;
453
+ background: none;
454
+ color: var(--m-muted);
455
+ font-size: 13px;
456
+ }
457
+ }
458
+ @container m-calendar (min-width: 640px) {
459
+ .m-calendar-main,
460
+ .m-calendar-agenda {
461
+ flex-basis: 0;
462
+ }
463
+ .m-calendar-agenda {
464
+ padding-top: 0;
465
+ border-top: 0;
466
+ }
467
+ }
468
+ }