@glw907/cairn-cms 0.37.1 → 0.40.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 (69) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/README.md +6 -5
  3. package/dist/components/AdminLayout.svelte +53 -0
  4. package/dist/components/ComponentInsertDialog.svelte +27 -13
  5. package/dist/components/ComponentInsertDialog.svelte.d.ts +13 -2
  6. package/dist/components/ConceptList.svelte +13 -3
  7. package/dist/components/DeleteDialog.svelte +18 -7
  8. package/dist/components/DeleteDialog.svelte.d.ts +11 -1
  9. package/dist/components/EditPage.svelte +575 -70
  10. package/dist/components/EditPage.svelte.d.ts +8 -1
  11. package/dist/components/EditorToolbar.svelte +202 -29
  12. package/dist/components/EditorToolbar.svelte.d.ts +12 -4
  13. package/dist/components/LinkPicker.svelte +14 -6
  14. package/dist/components/LinkPicker.svelte.d.ts +9 -2
  15. package/dist/components/LoginPage.svelte +16 -4
  16. package/dist/components/LoginPage.svelte.d.ts +3 -1
  17. package/dist/components/MarkdownEditor.svelte +80 -34
  18. package/dist/components/MarkdownEditor.svelte.d.ts +9 -3
  19. package/dist/components/MarkdownHelpDialog.svelte +58 -0
  20. package/dist/components/MarkdownHelpDialog.svelte.d.ts +11 -0
  21. package/dist/components/RenameDialog.svelte +13 -4
  22. package/dist/components/RenameDialog.svelte.d.ts +9 -1
  23. package/dist/components/WebLinkDialog.svelte +89 -0
  24. package/dist/components/WebLinkDialog.svelte.d.ts +23 -0
  25. package/dist/components/cairn-admin.css +353 -4
  26. package/dist/components/editor-highlight.d.ts +9 -0
  27. package/dist/components/editor-highlight.js +62 -0
  28. package/dist/components/markdown-directives.d.ts +7 -0
  29. package/dist/components/markdown-directives.js +22 -0
  30. package/dist/components/markdown-format.d.ts +1 -1
  31. package/dist/components/markdown-format.js +91 -12
  32. package/dist/content/pending.d.ts +9 -0
  33. package/dist/content/pending.js +24 -0
  34. package/dist/diagnostics/conditions.js +16 -0
  35. package/dist/email.d.ts +20 -1
  36. package/dist/email.js +25 -0
  37. package/dist/github/branches.d.ts +11 -0
  38. package/dist/github/branches.js +75 -0
  39. package/dist/log/events.d.ts +1 -1
  40. package/dist/sveltekit/auth-routes.d.ts +16 -3
  41. package/dist/sveltekit/auth-routes.js +47 -28
  42. package/dist/sveltekit/content-routes.d.ts +22 -1
  43. package/dist/sveltekit/content-routes.js +312 -72
  44. package/dist/sveltekit/index.d.ts +1 -1
  45. package/package.json +3 -2
  46. package/src/lib/components/AdminLayout.svelte +53 -0
  47. package/src/lib/components/ComponentInsertDialog.svelte +27 -13
  48. package/src/lib/components/ConceptList.svelte +13 -3
  49. package/src/lib/components/DeleteDialog.svelte +18 -7
  50. package/src/lib/components/EditPage.svelte +575 -70
  51. package/src/lib/components/EditorToolbar.svelte +202 -29
  52. package/src/lib/components/LinkPicker.svelte +14 -6
  53. package/src/lib/components/LoginPage.svelte +16 -4
  54. package/src/lib/components/MarkdownEditor.svelte +80 -34
  55. package/src/lib/components/MarkdownHelpDialog.svelte +58 -0
  56. package/src/lib/components/RenameDialog.svelte +13 -4
  57. package/src/lib/components/WebLinkDialog.svelte +89 -0
  58. package/src/lib/components/cairn-admin.css +26 -4
  59. package/src/lib/components/editor-highlight.ts +67 -0
  60. package/src/lib/components/markdown-directives.ts +23 -0
  61. package/src/lib/components/markdown-format.ts +118 -13
  62. package/src/lib/content/pending.ts +24 -0
  63. package/src/lib/diagnostics/conditions.ts +16 -0
  64. package/src/lib/email.ts +31 -1
  65. package/src/lib/github/branches.ts +83 -0
  66. package/src/lib/log/events.ts +3 -0
  67. package/src/lib/sveltekit/auth-routes.ts +59 -29
  68. package/src/lib/sveltekit/content-routes.ts +391 -73
  69. package/src/lib/sveltekit/index.ts +1 -1
@@ -47,6 +47,19 @@
47
47
  --tw-drop-shadow-color: initial;
48
48
  --tw-drop-shadow-alpha: 100%;
49
49
  --tw-drop-shadow-size: initial;
50
+ --tw-backdrop-blur: initial;
51
+ --tw-backdrop-brightness: initial;
52
+ --tw-backdrop-contrast: initial;
53
+ --tw-backdrop-grayscale: initial;
54
+ --tw-backdrop-hue-rotate: initial;
55
+ --tw-backdrop-invert: initial;
56
+ --tw-backdrop-opacity: initial;
57
+ --tw-backdrop-saturate: initial;
58
+ --tw-backdrop-sepia: initial;
59
+ --tw-duration: initial;
60
+ --tw-translate-x: 0;
61
+ --tw-translate-y: 0;
62
+ --tw-translate-z: 0;
50
63
  }
51
64
  }
52
65
  }
@@ -75,6 +88,9 @@
75
88
  --text-xl--line-height: calc(1.75 / 1.25);
76
89
  --text-2xl: 1.5rem;
77
90
  --text-2xl--line-height: calc(2 / 1.5);
91
+ --text-3xl: 1.875rem;
92
+ --text-3xl--line-height: calc(2.25 / 1.875);
93
+ --font-weight-normal: 400;
78
94
  --font-weight-medium: 500;
79
95
  --font-weight-semibold: 600;
80
96
  --font-weight-bold: 700;
@@ -145,6 +161,24 @@
145
161
  box-shadow: 0 2px 4px color-mix(in oklch, var(--color-primary) 26%, transparent), 0 10px 24px -5px color-mix(in oklch, var(--color-primary) 48%, transparent);
146
162
  }
147
163
  }
164
+
165
+ :where([data-theme="cairn-admin"], [data-theme="cairn-admin-dark"]) .cairn-doc-title:focus {
166
+ outline: 1px solid var(--color-primary);
167
+ }
168
+
169
+ @supports (color: color-mix(in lab, red, red)) {
170
+ :where([data-theme="cairn-admin"], [data-theme="cairn-admin-dark"]) .cairn-doc-title:focus {
171
+ outline: 1px solid color-mix(in oklab, var(--color-primary) 70%, transparent);
172
+ }
173
+ }
174
+
175
+ :where([data-theme="cairn-admin"], [data-theme="cairn-admin-dark"]) .cairn-doc-title:focus {
176
+ outline-offset: -1px;
177
+ }
178
+
179
+ :where([data-theme="cairn-admin"], [data-theme="cairn-admin-dark"]) :is(a, button, input, textarea, select, summary, [tabindex]) {
180
+ scroll-margin-top: 8.5rem;
181
+ }
148
182
  }
149
183
 
150
184
  @layer utilities {
@@ -1093,6 +1127,10 @@
1093
1127
  }
1094
1128
  }
1095
1129
 
1130
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .pointer-events-none {
1131
+ pointer-events: none;
1132
+ }
1133
+
1096
1134
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .collapse:not(td, tr, colgroup) {
1097
1135
  visibility: revert-layer;
1098
1136
  }
@@ -1721,6 +1759,25 @@
1721
1759
  }
1722
1760
  }
1723
1761
 
1762
+ @layer daisyui.l1.l2.l3 {
1763
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .indicator {
1764
+ width: max-content;
1765
+ display: inline-flex;
1766
+ position: relative;
1767
+ }
1768
+
1769
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .indicator :where(.indicator-item) {
1770
+ z-index: 1;
1771
+ white-space: nowrap;
1772
+ top: var(--indicator-t, 0);
1773
+ bottom: var(--indicator-b, auto);
1774
+ left: var(--indicator-s, auto);
1775
+ right: var(--indicator-e, 0);
1776
+ translate: var(--indicator-x, 50%) var(--indicator-y, -50%);
1777
+ position: absolute;
1778
+ }
1779
+ }
1780
+
1724
1781
  @layer daisyui.l1.l2.l3 {
1725
1782
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .table {
1726
1783
  border-collapse: separate;
@@ -2714,6 +2771,10 @@
2714
2771
  top: calc(var(--spacing) * 0);
2715
2772
  }
2716
2773
 
2774
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .top-16 {
2775
+ top: calc(var(--spacing) * 16);
2776
+ }
2777
+
2717
2778
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .join {
2718
2779
  --join-ss: 0;
2719
2780
  --join-se: 0;
@@ -2898,6 +2959,23 @@
2898
2959
  }
2899
2960
  }
2900
2961
 
2962
+ @layer daisyui.l1.l2 {
2963
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .btn-active {
2964
+ --btn-bg: var(--btn-color, var(--color-base-200));
2965
+ }
2966
+
2967
+ @supports (color: color-mix(in lab, red, red)) {
2968
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .btn-active {
2969
+ --btn-bg: color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 7%);
2970
+ }
2971
+ }
2972
+
2973
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .btn-active {
2974
+ --btn-shadow: 0 0 0 0 oklch(0% 0 0 / 0), 0 0 0 0 oklch(0% 0 0 / 0);
2975
+ isolation: isolate;
2976
+ }
2977
+ }
2978
+
2901
2979
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .isolate {
2902
2980
  isolation: isolate;
2903
2981
  }
@@ -3131,6 +3209,10 @@
3131
3209
  }
3132
3210
  }
3133
3211
 
3212
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .m-0 {
3213
+ margin: calc(var(--spacing) * 0);
3214
+ }
3215
+
3134
3216
  @layer daisyui.l1.l2.l3 {
3135
3217
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .filter {
3136
3218
  flex-wrap: wrap;
@@ -3180,6 +3262,10 @@
3180
3262
  }
3181
3263
  }
3182
3264
 
3265
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .-mx-4 {
3266
+ margin-inline: calc(var(--spacing) * -4);
3267
+ }
3268
+
3183
3269
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .mx-auto {
3184
3270
  margin-inline: auto;
3185
3271
  }
@@ -3314,6 +3400,15 @@
3314
3400
  }
3315
3401
  }
3316
3402
 
3403
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .join-item:where(:not(:first-child, :disabled, [disabled], .btn-disabled)) {
3404
+ margin-block-start: 0;
3405
+ margin-inline-start: calc(var(--border, 1px) * -1);
3406
+ }
3407
+
3408
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .join-item:where(:is(:disabled, [disabled], .btn-disabled)) {
3409
+ border-width: var(--border, 1px) 0 var(--border, 1px) var(--border, 1px);
3410
+ }
3411
+
3317
3412
  @layer daisyui.l1.l2.l3 {
3318
3413
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .modal-action {
3319
3414
  justify-content: flex-end;
@@ -3784,6 +3879,10 @@
3784
3879
  }
3785
3880
  }
3786
3881
 
3882
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .h-1\.5 {
3883
+ height: calc(var(--spacing) * 1.5);
3884
+ }
3885
+
3787
3886
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .h-3 {
3788
3887
  height: calc(var(--spacing) * 3);
3789
3888
  }
@@ -3828,6 +3927,10 @@
3828
3927
  min-height: calc(var(--spacing) * 64);
3829
3928
  }
3830
3929
 
3930
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .min-h-\[50vh\] {
3931
+ min-height: 50vh;
3932
+ }
3933
+
3831
3934
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .min-h-full {
3832
3935
  min-height: 100%;
3833
3936
  }
@@ -3854,6 +3957,10 @@
3854
3957
  }
3855
3958
  }
3856
3959
 
3960
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .w-1\.5 {
3961
+ width: calc(var(--spacing) * 1.5);
3962
+ }
3963
+
3857
3964
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .w-3 {
3858
3965
  width: calc(var(--spacing) * 3);
3859
3966
  }
@@ -3890,6 +3997,10 @@
3890
3997
  width: calc(var(--spacing) * 12);
3891
3998
  }
3892
3999
 
4000
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .w-44 {
4001
+ width: calc(var(--spacing) * 44);
4002
+ }
4003
+
3893
4004
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .w-56 {
3894
4005
  width: calc(var(--spacing) * 56);
3895
4006
  }
@@ -3910,6 +4021,10 @@
3910
4021
  width: 100%;
3911
4022
  }
3912
4023
 
4024
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .w-px {
4025
+ width: 1px;
4026
+ }
4027
+
3913
4028
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .max-w-3xl {
3914
4029
  max-width: var(--container-3xl);
3915
4030
  }
@@ -4084,6 +4199,10 @@
4084
4199
  gap: calc(var(--spacing) * 1);
4085
4200
  }
4086
4201
 
4202
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .gap-1\.5 {
4203
+ gap: calc(var(--spacing) * 1.5);
4204
+ }
4205
+
4087
4206
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .gap-2 {
4088
4207
  gap: calc(var(--spacing) * 2);
4089
4208
  }
@@ -4114,10 +4233,30 @@
4114
4233
  margin-block-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)));
4115
4234
  }
4116
4235
 
4236
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .gap-x-3 {
4237
+ column-gap: calc(var(--spacing) * 3);
4238
+ }
4239
+
4240
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .gap-x-4 {
4241
+ column-gap: calc(var(--spacing) * 4);
4242
+ }
4243
+
4244
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .gap-y-1 {
4245
+ row-gap: calc(var(--spacing) * 1);
4246
+ }
4247
+
4248
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .gap-y-2 {
4249
+ row-gap: calc(var(--spacing) * 2);
4250
+ }
4251
+
4117
4252
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .self-start {
4118
4253
  align-self: flex-start;
4119
4254
  }
4120
4255
 
4256
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .self-stretch {
4257
+ align-self: stretch;
4258
+ }
4259
+
4121
4260
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .truncate {
4122
4261
  text-overflow: ellipsis;
4123
4262
  white-space: nowrap;
@@ -4203,6 +4342,11 @@
4203
4342
  border-width: 1px;
4204
4343
  }
4205
4344
 
4345
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .border-0 {
4346
+ border-style: var(--tw-border-style);
4347
+ border-width: 0;
4348
+ }
4349
+
4206
4350
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .border-t {
4207
4351
  border-top-style: var(--tw-border-style);
4208
4352
  border-top-width: 1px;
@@ -4261,6 +4405,19 @@
4261
4405
  }
4262
4406
  }
4263
4407
 
4408
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .glass {
4409
+ backdrop-filter: blur(var(--glass-blur, 40px));
4410
+ background-color: #0000;
4411
+ background-image: linear-gradient(135deg, oklch(100% 0 0 / var(--glass-opacity, 30%)) 0%, oklch(0% 0 0 / 0) 100%), linear-gradient(var(--glass-reflect-degree, 100deg), oklch(100% 0 0 / var(--glass-reflect-opacity, 5%)) 25%, oklch(0% 0 0 / 0) 25%);
4412
+ box-shadow: 0 0 0 1px oklch(100% 0 0 / var(--glass-border-opacity, 20%)) inset, 0 0 0 2px oklch(0% 0 0 / .05);
4413
+ text-shadow: 0 1px oklch(0% 0 0 / var(--glass-text-shadow-opacity, 5%));
4414
+ border: none;
4415
+ }
4416
+
4417
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .bg-\[var\(--cairn-card-border\)\] {
4418
+ background-color: var(--cairn-card-border);
4419
+ }
4420
+
4264
4421
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .bg-base-100 {
4265
4422
  background-color: var(--color-base-100);
4266
4423
  }
@@ -4279,6 +4436,16 @@
4279
4436
  }
4280
4437
  }
4281
4438
 
4439
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .bg-base-200\/90 {
4440
+ background-color: var(--color-base-200);
4441
+ }
4442
+
4443
+ @supports (color: color-mix(in lab, red, red)) {
4444
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .bg-base-200\/90 {
4445
+ background-color: color-mix(in oklab, var(--color-base-200) 90%, transparent);
4446
+ }
4447
+ }
4448
+
4282
4449
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .bg-base-content\/\[0\.04\] {
4283
4450
  background-color: var(--color-base-content);
4284
4451
  }
@@ -4311,6 +4478,10 @@
4311
4478
  background-color: #0000;
4312
4479
  }
4313
4480
 
4481
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .bg-warning {
4482
+ background-color: var(--color-warning);
4483
+ }
4484
+
4314
4485
  @layer daisyui.l1.l2 {
4315
4486
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .loading-spinner {
4316
4487
  mask-image: url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");
@@ -4391,6 +4562,17 @@
4391
4562
  }
4392
4563
  }
4393
4564
 
4565
+ @layer daisyui.l1.l2 {
4566
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .table-sm :not(thead, tfoot) tr {
4567
+ font-size: .75rem;
4568
+ }
4569
+
4570
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .table-sm :where(th, td) {
4571
+ padding-block: .5rem;
4572
+ padding-inline: .75rem;
4573
+ }
4574
+ }
4575
+
4394
4576
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .px-1\.5 {
4395
4577
  padding-inline: calc(var(--spacing) * 1.5);
4396
4578
  }
@@ -4415,6 +4597,10 @@
4415
4597
  padding-inline: calc(var(--spacing) * 6);
4416
4598
  }
4417
4599
 
4600
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .py-1 {
4601
+ padding-block: calc(var(--spacing) * 1);
4602
+ }
4603
+
4418
4604
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .py-1\.5 {
4419
4605
  padding-block: calc(var(--spacing) * 1.5);
4420
4606
  }
@@ -4423,6 +4609,10 @@
4423
4609
  padding-block: calc(var(--spacing) * 2);
4424
4610
  }
4425
4611
 
4612
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .py-3 {
4613
+ padding-block: calc(var(--spacing) * 3);
4614
+ }
4615
+
4426
4616
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .py-3\.5 {
4427
4617
  padding-block: calc(var(--spacing) * 3.5);
4428
4618
  }
@@ -4492,6 +4682,11 @@
4492
4682
  line-height: var(--tw-leading, var(--text-2xl--line-height));
4493
4683
  }
4494
4684
 
4685
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .text-3xl {
4686
+ font-size: var(--text-3xl);
4687
+ line-height: var(--tw-leading, var(--text-3xl--line-height));
4688
+ }
4689
+
4495
4690
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .text-base {
4496
4691
  font-size: var(--text-base);
4497
4692
  line-height: var(--tw-leading, var(--text-base--line-height));
@@ -4551,6 +4746,11 @@
4551
4746
  font-weight: var(--font-weight-medium);
4552
4747
  }
4553
4748
 
4749
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .font-normal {
4750
+ --tw-font-weight: var(--font-weight-normal);
4751
+ font-weight: var(--font-weight-normal);
4752
+ }
4753
+
4554
4754
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .font-semibold {
4555
4755
  --tw-font-weight: var(--font-weight-semibold);
4556
4756
  font-weight: var(--font-weight-semibold);
@@ -4581,6 +4781,10 @@
4581
4781
  letter-spacing: var(--tracking-wide);
4582
4782
  }
4583
4783
 
4784
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .break-all {
4785
+ word-break: break-all;
4786
+ }
4787
+
4584
4788
  @layer daisyui.l1.l2 {
4585
4789
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .alert-error {
4586
4790
  color: var(--color-error-content);
@@ -4670,6 +4874,10 @@
4670
4874
  }
4671
4875
  }
4672
4876
 
4877
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .line-through {
4878
+ text-decoration-line: line-through;
4879
+ }
4880
+
4673
4881
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .no-underline {
4674
4882
  text-decoration-line: none;
4675
4883
  }
@@ -4682,6 +4890,10 @@
4682
4890
  text-decoration-line: underline;
4683
4891
  }
4684
4892
 
4893
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .opacity-0 {
4894
+ opacity: 0;
4895
+ }
4896
+
4685
4897
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .opacity-30 {
4686
4898
  opacity: .3;
4687
4899
  }
@@ -4773,12 +4985,23 @@
4773
4985
  filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );
4774
4986
  }
4775
4987
 
4988
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .backdrop-blur {
4989
+ --tw-backdrop-blur: blur(8px);
4990
+ backdrop-filter: var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, );
4991
+ }
4992
+
4776
4993
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .transition {
4777
4994
  transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;
4778
4995
  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
4779
4996
  transition-duration: var(--tw-duration, var(--default-transition-duration));
4780
4997
  }
4781
4998
 
4999
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .transition-all {
5000
+ transition-property: all;
5001
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
5002
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
5003
+ }
5004
+
4782
5005
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .transition-colors {
4783
5006
  transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
4784
5007
  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
@@ -4791,6 +5014,31 @@
4791
5014
  transition-duration: var(--tw-duration, var(--default-transition-duration));
4792
5015
  }
4793
5016
 
5017
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .duration-300 {
5018
+ --tw-duration: .3s;
5019
+ transition-duration: .3s;
5020
+ }
5021
+
5022
+ @layer daisyui.l1 {
5023
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .btn-outline:not(.btn-active, :hover, :active:focus, :focus-visible, input:checked:not(.filter .btn), :disabled, [disabled], .btn-disabled) {
5024
+ --btn-shadow: "";
5025
+ --btn-bg: #0000;
5026
+ --btn-fg: var(--btn-color);
5027
+ --btn-border: var(--btn-color);
5028
+ --btn-noise: none;
5029
+ }
5030
+
5031
+ @media (hover: none) {
5032
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .btn-outline:not(.btn-active, :active, :focus-visible, input:checked:not(.filter .btn)):hover {
5033
+ --btn-shadow: "";
5034
+ --btn-bg: #0000;
5035
+ --btn-fg: var(--btn-color);
5036
+ --btn-border: var(--btn-color);
5037
+ --btn-noise: none;
5038
+ }
5039
+ }
5040
+ }
5041
+
4794
5042
  @layer daisyui.l1.l2 {
4795
5043
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .btn-sm {
4796
5044
  --fontsize: .75rem;
@@ -4807,6 +5055,20 @@
4807
5055
  }
4808
5056
  }
4809
5057
 
5058
+ @layer daisyui.l1.l2 {
5059
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .badge-info {
5060
+ --badge-color: var(--color-info);
5061
+ --badge-fg: var(--color-info-content);
5062
+ }
5063
+ }
5064
+
5065
+ @layer daisyui.l1.l2 {
5066
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .badge-neutral {
5067
+ --badge-color: var(--color-neutral);
5068
+ --badge-fg: var(--color-neutral-content);
5069
+ }
5070
+ }
5071
+
4810
5072
  @layer daisyui.l1.l2 {
4811
5073
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .badge-primary {
4812
5074
  --badge-color: var(--color-primary);
@@ -5058,6 +5320,12 @@
5058
5320
  }
5059
5321
  }
5060
5322
 
5323
+ @media (width >= 64rem) {
5324
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .lg\:-mx-8 {
5325
+ margin-inline: calc(var(--spacing) * -8);
5326
+ }
5327
+ }
5328
+
5061
5329
  @media (width >= 64rem) {
5062
5330
  :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .lg\:mt-0 {
5063
5331
  margin-top: calc(var(--spacing) * 0);
@@ -5118,6 +5386,19 @@
5118
5386
  padding-inline: calc(var(--spacing) * 8);
5119
5387
  }
5120
5388
  }
5389
+
5390
+ @starting-style {
5391
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .starting\:-translate-y-2 {
5392
+ --tw-translate-y: calc(var(--spacing) * -2);
5393
+ translate: var(--tw-translate-x) var(--tw-translate-y);
5394
+ }
5395
+ }
5396
+
5397
+ @starting-style {
5398
+ :where([data-theme='cairn-admin'], [data-theme='cairn-admin-dark']) .starting\:opacity-0 {
5399
+ opacity: 0;
5400
+ }
5401
+ }
5121
5402
  }
5122
5403
 
5123
5404
  [data-theme="cairn-admin"] {
@@ -5135,17 +5416,17 @@
5135
5416
  --color-primary-content: oklch(98% .012 293);
5136
5417
  --color-secondary: oklch(45% .02 75);
5137
5418
  --color-secondary-content: oklch(98% .004 75);
5138
- --color-accent: oklch(58% .16 300);
5419
+ --color-accent: oklch(54% .16 300);
5139
5420
  --color-accent-content: oklch(98% .012 300);
5140
5421
  --color-neutral: oklch(32% .012 75);
5141
5422
  --color-neutral-content: oklch(96% .004 75);
5142
- --color-info: oklch(60% .12 240);
5423
+ --color-info: oklch(52% .12 240);
5143
5424
  --color-info-content: oklch(98% .012 240);
5144
- --color-success: oklch(58% .12 150);
5425
+ --color-success: oklch(52% .12 150);
5145
5426
  --color-success-content: oklch(98% .012 150);
5146
5427
  --color-warning: oklch(75% .15 70);
5147
5428
  --color-warning-content: oklch(26% .05 70);
5148
- --color-error: oklch(58% .2 25);
5429
+ --color-error: oklch(56% .2 25);
5149
5430
  --color-error-content: oklch(98% .012 25);
5150
5431
  --color-muted: oklch(48% .01 75);
5151
5432
  --color-subtle: oklch(42% .01 75);
@@ -5575,6 +5856,74 @@
5575
5856
  inherits: false
5576
5857
  }
5577
5858
 
5859
+ @property --tw-backdrop-blur {
5860
+ syntax: "*";
5861
+ inherits: false
5862
+ }
5863
+
5864
+ @property --tw-backdrop-brightness {
5865
+ syntax: "*";
5866
+ inherits: false
5867
+ }
5868
+
5869
+ @property --tw-backdrop-contrast {
5870
+ syntax: "*";
5871
+ inherits: false
5872
+ }
5873
+
5874
+ @property --tw-backdrop-grayscale {
5875
+ syntax: "*";
5876
+ inherits: false
5877
+ }
5878
+
5879
+ @property --tw-backdrop-hue-rotate {
5880
+ syntax: "*";
5881
+ inherits: false
5882
+ }
5883
+
5884
+ @property --tw-backdrop-invert {
5885
+ syntax: "*";
5886
+ inherits: false
5887
+ }
5888
+
5889
+ @property --tw-backdrop-opacity {
5890
+ syntax: "*";
5891
+ inherits: false
5892
+ }
5893
+
5894
+ @property --tw-backdrop-saturate {
5895
+ syntax: "*";
5896
+ inherits: false
5897
+ }
5898
+
5899
+ @property --tw-backdrop-sepia {
5900
+ syntax: "*";
5901
+ inherits: false
5902
+ }
5903
+
5904
+ @property --tw-duration {
5905
+ syntax: "*";
5906
+ inherits: false
5907
+ }
5908
+
5909
+ @property --tw-translate-x {
5910
+ syntax: "*";
5911
+ inherits: false;
5912
+ initial-value: 0;
5913
+ }
5914
+
5915
+ @property --tw-translate-y {
5916
+ syntax: "*";
5917
+ inherits: false;
5918
+ initial-value: 0;
5919
+ }
5920
+
5921
+ @property --tw-translate-z {
5922
+ syntax: "*";
5923
+ inherits: false;
5924
+ initial-value: 0;
5925
+ }
5926
+
5578
5927
  @keyframes spin {
5579
5928
  to {
5580
5929
  transform: rotate(360deg);
@@ -0,0 +1,9 @@
1
+ import { HighlightStyle } from '@codemirror/language';
2
+ import { ViewPlugin, type DecorationSet, type ViewUpdate } from '@codemirror/view';
3
+ /** Markdown token colors over the admin theme variables. */
4
+ export declare function cairnHighlightStyle(): HighlightStyle;
5
+ /** Line and mark decorations flagging remark-directive machinery. */
6
+ export declare function cairnDirectivePlugin(): ViewPlugin<{
7
+ decorations: DecorationSet;
8
+ update(update: ViewUpdate): void;
9
+ }, undefined>;
@@ -0,0 +1,62 @@
1
+ // The editor's syntax colors and the directive machinery decorations. Colors reference the Warm
2
+ // Stone CSS variables so light and dark themes both resolve, and every token pair must hold WCAG
3
+ // AA against --color-base-100 (checked in the design pass).
4
+ import { HighlightStyle } from '@codemirror/language';
5
+ import { tags } from '@lezer/highlight';
6
+ import { Decoration, ViewPlugin } from '@codemirror/view';
7
+ import { RangeSetBuilder } from '@codemirror/state';
8
+ import { directiveLineKind, findInlineDirectives } from './markdown-directives.js';
9
+ /** Markdown token colors over the admin theme variables. */
10
+ export function cairnHighlightStyle() {
11
+ return HighlightStyle.define([
12
+ { tag: tags.heading, color: 'var(--color-primary)', fontWeight: '700' },
13
+ { tag: tags.strong, fontWeight: '700' },
14
+ { tag: tags.emphasis, fontStyle: 'italic' },
15
+ { tag: tags.strikethrough, textDecoration: 'line-through' },
16
+ { tag: tags.link, color: 'var(--color-info)' },
17
+ { tag: tags.url, color: 'var(--color-info)' },
18
+ { tag: tags.quote, color: 'var(--color-muted)', fontStyle: 'italic' },
19
+ { tag: tags.monospace, color: 'var(--color-accent)' },
20
+ { tag: tags.processingInstruction, color: 'var(--color-muted)' },
21
+ { tag: tags.list, color: 'var(--color-muted)' },
22
+ ]);
23
+ }
24
+ // The machinery lines explain themselves on hover, so an editor who has never seen ::: syntax
25
+ // learns what the line is without leaving the page.
26
+ const MACHINERY_HINT = 'Layout marker. Edit the text between these lines and leave this line as it is.';
27
+ const fenceLine = Decoration.line({ class: 'cm-cairn-directive-fence', attributes: { title: MACHINERY_HINT } });
28
+ const leafLine = Decoration.line({ class: 'cm-cairn-directive-leaf', attributes: { title: MACHINERY_HINT } });
29
+ const inlineMark = Decoration.mark({ class: 'cm-cairn-directive-inline' });
30
+ function buildDirectiveDecorations(view) {
31
+ const builder = new RangeSetBuilder();
32
+ for (const { from, to } of view.visibleRanges) {
33
+ for (let pos = from; pos <= to;) {
34
+ const line = view.state.doc.lineAt(pos);
35
+ const kind = directiveLineKind(line.text);
36
+ if (kind === 'fence')
37
+ builder.add(line.from, line.from, fenceLine);
38
+ else if (kind === 'leaf')
39
+ builder.add(line.from, line.from, leafLine);
40
+ else {
41
+ for (const r of findInlineDirectives(line.text)) {
42
+ builder.add(line.from + r.from, line.from + r.to, inlineMark);
43
+ }
44
+ }
45
+ pos = line.to + 1;
46
+ }
47
+ }
48
+ return builder.finish();
49
+ }
50
+ /** Line and mark decorations flagging remark-directive machinery. */
51
+ export function cairnDirectivePlugin() {
52
+ return ViewPlugin.fromClass(class {
53
+ decorations;
54
+ constructor(view) {
55
+ this.decorations = buildDirectiveDecorations(view);
56
+ }
57
+ update(update) {
58
+ if (update.docChanged || update.viewportChanged)
59
+ this.decorations = buildDirectiveDecorations(update.view);
60
+ }
61
+ }, { decorations: (v) => v.decorations });
62
+ }
@@ -0,0 +1,7 @@
1
+ /** Classify a whole line as a container fence, a leaf directive, or neither. */
2
+ export declare function directiveLineKind(line: string): 'fence' | 'leaf' | null;
3
+ /** Inline directive ranges (`:name[...]{...}`) within a line of text. */
4
+ export declare function findInlineDirectives(text: string): {
5
+ from: number;
6
+ to: number;
7
+ }[];