iron-cms 0.17.2 → 0.18.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 (142) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +88 -4
  3. data/app/assets/builds/iron.css +255 -106
  4. data/app/assets/tailwind/iron/application.css +1 -0
  5. data/app/assets/tailwind/iron/components/file-upload.css +26 -0
  6. data/app/assets/tailwind/iron/lexxy.css +111 -87
  7. data/app/controllers/concerns/iron/schema_editing.rb +19 -0
  8. data/app/controllers/iron/api/schema/base_controller.rb +25 -0
  9. data/app/controllers/iron/api/schema/block_definitions_controller.rb +49 -0
  10. data/app/controllers/iron/api/schema/content_types_controller.rb +64 -0
  11. data/app/controllers/iron/api/schema/field_definitions_controller.rb +88 -0
  12. data/app/controllers/iron/api/schema/locales_controller.rb +52 -0
  13. data/app/controllers/iron/application_controller.rb +1 -1
  14. data/app/controllers/iron/block_definitions_controller.rb +1 -0
  15. data/app/controllers/iron/content_types_controller.rb +1 -0
  16. data/app/controllers/iron/field_definitions_controller.rb +2 -1
  17. data/app/controllers/iron/first_runs_controller.rb +1 -1
  18. data/app/controllers/iron/locales_controller.rb +1 -0
  19. data/app/controllers/iron/sessions_controller.rb +1 -1
  20. data/app/helpers/iron/avatar_helper.rb +24 -2
  21. data/app/javascript/iron/controllers/file_upload_controller.js +38 -7
  22. data/app/models/iron/account.rb +1 -1
  23. data/app/models/iron/api/openapi_spec.rb +37 -15
  24. data/app/models/iron/block_definition/exportable.rb +1 -1
  25. data/app/models/iron/block_definition.rb +3 -1
  26. data/app/models/iron/content.rb +176 -0
  27. data/app/models/iron/content_type/exportable.rb +3 -1
  28. data/app/models/iron/content_type/importable.rb +1 -1
  29. data/app/models/iron/content_type.rb +6 -1
  30. data/app/models/iron/entry/content_assignable.rb +10 -2
  31. data/app/models/iron/exporter.rb +1 -26
  32. data/app/models/iron/field/length_constrained.rb +17 -0
  33. data/app/models/iron/field/validatable.rb +16 -0
  34. data/app/models/iron/field.rb +1 -1
  35. data/app/models/iron/field_definition/exportable.rb +3 -4
  36. data/app/models/iron/field_definition/importable.rb +16 -9
  37. data/app/models/iron/field_definition/ranked.rb +1 -1
  38. data/app/models/iron/field_definition/searchable.rb +2 -0
  39. data/app/models/iron/field_definition/validatable.rb +40 -0
  40. data/app/models/iron/field_definition/validations.rb +175 -0
  41. data/app/models/iron/field_definition.rb +1 -1
  42. data/app/models/iron/field_definitions/date.rb +2 -0
  43. data/app/models/iron/field_definitions/file.rb +3 -11
  44. data/app/models/iron/field_definitions/number.rb +2 -0
  45. data/app/models/iron/field_definitions/reference.rb +2 -0
  46. data/app/models/iron/field_definitions/rich_text_area.rb +1 -0
  47. data/app/models/iron/field_definitions/text_area.rb +2 -0
  48. data/app/models/iron/field_definitions/text_field.rb +1 -9
  49. data/app/models/iron/fields/block.rb +5 -1
  50. data/app/models/iron/fields/block_list.rb +5 -1
  51. data/app/models/iron/fields/date.rb +19 -2
  52. data/app/models/iron/fields/file.rb +5 -3
  53. data/app/models/iron/fields/number.rb +28 -1
  54. data/app/models/iron/fields/reference.rb +2 -0
  55. data/app/models/iron/fields/rich_text_area.rb +2 -0
  56. data/app/models/iron/fields/text_area.rb +4 -0
  57. data/app/models/iron/fields/text_field.rb +9 -5
  58. data/app/models/iron/importer.rb +1 -54
  59. data/app/models/iron/locale.rb +2 -0
  60. data/app/models/iron/schema/auto_dumpable.rb +26 -0
  61. data/app/models/iron/schema/diff.rb +194 -0
  62. data/app/models/iron/schema/validation.rb +214 -0
  63. data/app/models/iron/schema.rb +282 -0
  64. data/app/models/iron/seed.rb +5 -3
  65. data/app/models/iron/system.rb +7 -0
  66. data/app/models/iron/user/deactivatable.rb +5 -0
  67. data/app/models/iron/user.rb +18 -1
  68. data/app/views/iron/api/fields/_rich_text_area.json.jbuilder +2 -2
  69. data/app/views/iron/api/schema/block_definitions/_block_definition.json.jbuilder +4 -0
  70. data/app/views/iron/api/schema/block_definitions/index.json.jbuilder +1 -0
  71. data/app/views/iron/api/schema/block_definitions/show.json.jbuilder +1 -0
  72. data/app/views/iron/api/schema/content_types/_content_type.json.jbuilder +5 -0
  73. data/app/views/iron/api/schema/content_types/index.json.jbuilder +1 -0
  74. data/app/views/iron/api/schema/content_types/show.json.jbuilder +1 -0
  75. data/app/views/iron/api/schema/field_definitions/_field_definition.json.jbuilder +7 -0
  76. data/app/views/iron/api/schema/field_definitions/show.json.jbuilder +1 -0
  77. data/app/views/iron/api/schema/locales/_locale.json.jbuilder +4 -0
  78. data/app/views/iron/api/schema/locales/index.json.jbuilder +1 -0
  79. data/app/views/iron/api/schema/locales/show.json.jbuilder +1 -0
  80. data/app/views/iron/block_definitions/_empty_state.html.erb +5 -3
  81. data/app/views/iron/block_definitions/_form.html.erb +3 -1
  82. data/app/views/iron/block_definitions/edit.html.erb +19 -17
  83. data/app/views/iron/block_definitions/index.html.erb +7 -3
  84. data/app/views/iron/block_definitions/show.html.erb +14 -8
  85. data/app/views/iron/content_types/_content_type.html.erb +1 -1
  86. data/app/views/iron/content_types/_empty_state.html.erb +5 -3
  87. data/app/views/iron/content_types/_form.html.erb +12 -8
  88. data/app/views/iron/content_types/edit.html.erb +19 -17
  89. data/app/views/iron/content_types/index.html.erb +7 -3
  90. data/app/views/iron/content_types/show.html.erb +14 -8
  91. data/app/views/iron/entries/_empty_state.html.erb +1 -1
  92. data/app/views/iron/entries/edit.html.erb +1 -1
  93. data/app/views/iron/entries/entry.html.erb +1 -1
  94. data/app/views/iron/entries/fields/_block.html.erb +4 -0
  95. data/app/views/iron/entries/fields/_block_list.html.erb +2 -0
  96. data/app/views/iron/entries/fields/_boolean.html.erb +1 -0
  97. data/app/views/iron/entries/fields/_date.html.erb +3 -2
  98. data/app/views/iron/entries/fields/_field_errors.html.erb +7 -0
  99. data/app/views/iron/entries/fields/_field_label.html.erb +8 -0
  100. data/app/views/iron/entries/fields/_file.html.erb +11 -19
  101. data/app/views/iron/entries/fields/_number.html.erb +6 -2
  102. data/app/views/iron/entries/fields/_reference.html.erb +2 -1
  103. data/app/views/iron/entries/fields/_reference_list.html.erb +2 -0
  104. data/app/views/iron/entries/fields/_rich_text_area.html.erb +2 -1
  105. data/app/views/iron/entries/fields/_text_area.html.erb +6 -2
  106. data/app/views/iron/entries/fields/_text_field.html.erb +5 -12
  107. data/app/views/iron/field_definitions/_field_definition.html.erb +51 -29
  108. data/app/views/iron/field_definitions/date/_form.html.erb +5 -1
  109. data/app/views/iron/field_definitions/edit.html.erb +10 -8
  110. data/app/views/iron/field_definitions/file/_form.html.erb +6 -0
  111. data/app/views/iron/field_definitions/new.html.erb +5 -3
  112. data/app/views/iron/field_definitions/number/_form.html.erb +23 -1
  113. data/app/views/iron/field_definitions/reference/_form.html.erb +5 -0
  114. data/app/views/iron/field_definitions/rich_text_area/_form.html.erb +5 -0
  115. data/app/views/iron/field_definitions/text_area/_form.html.erb +23 -0
  116. data/app/views/iron/field_definitions/text_field/_form.html.erb +20 -1
  117. data/app/views/iron/home/_content_types.html.erb +1 -1
  118. data/app/views/iron/locales/_form.html.erb +5 -3
  119. data/app/views/iron/locales/edit.html.erb +1 -1
  120. data/app/views/iron/locales/index.html.erb +12 -6
  121. data/app/views/iron/shared/_schema_lock_badge.html.erb +19 -0
  122. data/config/locales/en.yml +13 -1
  123. data/config/locales/it.yml +18 -1
  124. data/config/routes.rb +11 -0
  125. data/db/migrate/20260612131538_create_iron_systems.rb +9 -0
  126. data/exe/iron +5 -0
  127. data/lib/generators/iron/agents/agents_generator.rb +52 -0
  128. data/lib/generators/iron/agents/templates/AGENTS.md +24 -0
  129. data/lib/generators/iron/agents/templates/SKILL.md +423 -0
  130. data/lib/generators/iron/install/install_generator.rb +118 -0
  131. data/lib/generators/iron/install/templates/iron_release.rake +5 -0
  132. data/lib/generators/iron/install/templates/schema.json +12 -0
  133. data/lib/generators/iron/install/templates/seeds.rb +13 -0
  134. data/lib/generators/iron/pages/pages_generator.rb +5 -0
  135. data/lib/generators/iron/pages/templates/pages_controller.rb +1 -1
  136. data/lib/generators/iron/pages/templates/show.html.erb +1 -1
  137. data/lib/install/template.rb +9 -0
  138. data/lib/iron/cli.rb +43 -0
  139. data/lib/iron/version.rb +1 -1
  140. data/lib/tasks/iron_content.rake +82 -0
  141. data/lib/tasks/iron_schema.rake +45 -0
  142. metadata +62 -3
@@ -21,6 +21,8 @@
21
21
  --color-orange-700: oklch(55.3% 0.195 38.402);
22
22
  --color-amber-50: oklch(98.7% 0.022 95.277);
23
23
  --color-amber-100: oklch(96.2% 0.059 95.617);
24
+ --color-amber-200: oklch(92.4% 0.12 95.746);
25
+ --color-amber-300: oklch(87.9% 0.169 91.605);
24
26
  --color-amber-400: oklch(82.8% 0.189 84.429);
25
27
  --color-amber-500: oklch(76.9% 0.188 70.08);
26
28
  --color-amber-600: oklch(66.6% 0.179 58.318);
@@ -914,6 +916,9 @@
914
916
  }
915
917
  }
916
918
  }
919
+ .pointer-events-none {
920
+ pointer-events: none;
921
+ }
917
922
  .collapse {
918
923
  visibility: collapse;
919
924
  }
@@ -1400,6 +1405,9 @@
1400
1405
  .top-0 {
1401
1406
  top: calc(var(--spacing) * 0);
1402
1407
  }
1408
+ .top-full {
1409
+ top: 100%;
1410
+ }
1403
1411
  .right-0 {
1404
1412
  right: calc(var(--spacing) * 0);
1405
1413
  }
@@ -1464,6 +1472,9 @@
1464
1472
  --tw-ring-inset: inset;
1465
1473
  }
1466
1474
  }
1475
+ .z-20 {
1476
+ z-index: 20;
1477
+ }
1467
1478
  .z-40 {
1468
1479
  z-index: 40;
1469
1480
  }
@@ -2310,6 +2321,9 @@
2310
2321
  .w-64 {
2311
2322
  width: calc(var(--spacing) * 64);
2312
2323
  }
2324
+ .w-80 {
2325
+ width: calc(var(--spacing) * 80);
2326
+ }
2313
2327
  .w-\[500px\] {
2314
2328
  width: 500px;
2315
2329
  }
@@ -2636,6 +2650,12 @@
2636
2650
  --tw-border-style: dashed;
2637
2651
  border-style: dashed;
2638
2652
  }
2653
+ .border-amber-300\/70 {
2654
+ border-color: color-mix(in srgb, oklch(87.9% 0.169 91.605) 70%, transparent);
2655
+ @supports (color: color-mix(in lab, red, red)) {
2656
+ border-color: color-mix(in oklab, var(--color-amber-300) 70%, transparent);
2657
+ }
2658
+ }
2639
2659
  .border-sky-200\/50 {
2640
2660
  border-color: color-mix(in srgb, oklch(90.1% 0.058 230.902) 50%, transparent);
2641
2661
  @supports (color: color-mix(in lab, red, red)) {
@@ -2645,6 +2665,9 @@
2645
2665
  .border-stone-100 {
2646
2666
  border-color: var(--color-stone-100);
2647
2667
  }
2668
+ .border-stone-200 {
2669
+ border-color: var(--color-stone-200);
2670
+ }
2648
2671
  .border-stone-200\/80 {
2649
2672
  border-color: color-mix(in srgb, oklch(92.3% 0.003 48.717) 80%, transparent);
2650
2673
  @supports (color: color-mix(in lab, red, red)) {
@@ -2786,6 +2809,9 @@
2786
2809
  }
2787
2810
  }
2788
2811
  }
2812
+ .bg-amber-50 {
2813
+ background-color: var(--color-amber-50);
2814
+ }
2789
2815
  .bg-amber-100 {
2790
2816
  background-color: var(--color-amber-100);
2791
2817
  }
@@ -2807,6 +2833,9 @@
2807
2833
  background-color: color-mix(in oklab, var(--color-red-500) 10%, transparent);
2808
2834
  }
2809
2835
  }
2836
+ .bg-sky-100 {
2837
+ background-color: var(--color-sky-100);
2838
+ }
2810
2839
  .bg-stone-50 {
2811
2840
  background-color: var(--color-stone-50);
2812
2841
  }
@@ -2916,6 +2945,9 @@
2916
2945
  .p-2\.5 {
2917
2946
  padding: calc(var(--spacing) * 2.5);
2918
2947
  }
2948
+ .p-3\.5 {
2949
+ padding: calc(var(--spacing) * 3.5);
2950
+ }
2919
2951
  .p-4 {
2920
2952
  padding: calc(var(--spacing) * 4);
2921
2953
  }
@@ -2928,6 +2960,9 @@
2928
2960
  .p-\[5\%\] {
2929
2961
  padding: 5%;
2930
2962
  }
2963
+ .p-\[22\%\] {
2964
+ padding: 22%;
2965
+ }
2931
2966
  .page-content {
2932
2967
  padding-inline: calc(var(--spacing) * 4);
2933
2968
  padding-bottom: calc(var(--spacing) * 10);
@@ -3144,6 +3179,10 @@
3144
3179
  .text-\[48px\] {
3145
3180
  font-size: 48px;
3146
3181
  }
3182
+ .leading-relaxed {
3183
+ --tw-leading: var(--leading-relaxed);
3184
+ line-height: var(--leading-relaxed);
3185
+ }
3147
3186
  .font-bold {
3148
3187
  --tw-font-weight: var(--font-weight-bold);
3149
3188
  font-weight: var(--font-weight-bold);
@@ -3175,6 +3214,9 @@
3175
3214
  .text-amber-600 {
3176
3215
  color: var(--color-amber-600);
3177
3216
  }
3217
+ .text-amber-900 {
3218
+ color: var(--color-amber-900);
3219
+ }
3178
3220
  .text-current {
3179
3221
  color: currentcolor;
3180
3222
  }
@@ -3284,6 +3326,12 @@
3284
3326
  --tw-inset-ring-shadow: inset 0 0 0 1px var(--tw-inset-ring-color, currentcolor);
3285
3327
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
3286
3328
  }
3329
+ .ring-black\/5 {
3330
+ --tw-ring-color: color-mix(in srgb, #000 5%, transparent);
3331
+ @supports (color: color-mix(in lab, red, red)) {
3332
+ --tw-ring-color: color-mix(in oklab, var(--color-black) 5%, transparent);
3333
+ }
3334
+ }
3287
3335
  .ring-red-200 {
3288
3336
  --tw-ring-color: var(--color-red-200);
3289
3337
  }
@@ -3496,6 +3544,11 @@
3496
3544
  rotate: 180deg;
3497
3545
  }
3498
3546
  }
3547
+ .group-focus-within\:opacity-100 {
3548
+ &:is(:where(.group):focus-within *) {
3549
+ opacity: 100%;
3550
+ }
3551
+ }
3499
3552
  .group-hover\:opacity-100 {
3500
3553
  &:is(:where(.group):hover *) {
3501
3554
  @media (hover: hover) {
@@ -3592,6 +3645,13 @@
3592
3645
  }
3593
3646
  }
3594
3647
  }
3648
+ .hover\:bg-amber-100 {
3649
+ &:hover {
3650
+ @media (hover: hover) {
3651
+ background-color: var(--color-amber-100);
3652
+ }
3653
+ }
3654
+ }
3595
3655
  .hover\:bg-red-50 {
3596
3656
  &:hover {
3597
3657
  @media (hover: hover) {
@@ -3724,6 +3784,20 @@
3724
3784
  outline-style: none;
3725
3785
  }
3726
3786
  }
3787
+ .focus-visible\:ring-2 {
3788
+ &:focus-visible {
3789
+ --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
3790
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
3791
+ }
3792
+ }
3793
+ .focus-visible\:ring-amber-400\/60 {
3794
+ &:focus-visible {
3795
+ --tw-ring-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 60%, transparent);
3796
+ @supports (color: color-mix(in lab, red, red)) {
3797
+ --tw-ring-color: color-mix(in oklab, var(--color-amber-400) 60%, transparent);
3798
+ }
3799
+ }
3800
+ }
3727
3801
  .focus-visible\:outline-2 {
3728
3802
  &:focus-visible {
3729
3803
  outline-style: var(--tw-outline-style);
@@ -4005,6 +4079,14 @@
4005
4079
  }
4006
4080
  }
4007
4081
  }
4082
+ .dark\:border-amber-400\/20 {
4083
+ @media (prefers-color-scheme: dark) {
4084
+ border-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 20%, transparent);
4085
+ @supports (color: color-mix(in lab, red, red)) {
4086
+ border-color: color-mix(in oklab, var(--color-amber-400) 20%, transparent);
4087
+ }
4088
+ }
4089
+ }
4008
4090
  .dark\:border-sky-500\/20 {
4009
4091
  @media (prefers-color-scheme: dark) {
4010
4092
  border-color: color-mix(in srgb, oklch(68.5% 0.169 237.323) 20%, transparent);
@@ -4018,6 +4100,11 @@
4018
4100
  border-color: var(--color-stone-600);
4019
4101
  }
4020
4102
  }
4103
+ .dark\:border-stone-700 {
4104
+ @media (prefers-color-scheme: dark) {
4105
+ border-color: var(--color-stone-700);
4106
+ }
4107
+ }
4021
4108
  .dark\:border-stone-800 {
4022
4109
  @media (prefers-color-scheme: dark) {
4023
4110
  border-color: var(--color-stone-800);
@@ -4036,6 +4123,14 @@
4036
4123
  border-top-color: var(--color-stone-300);
4037
4124
  }
4038
4125
  }
4126
+ .dark\:bg-amber-400\/10 {
4127
+ @media (prefers-color-scheme: dark) {
4128
+ background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 10%, transparent);
4129
+ @supports (color: color-mix(in lab, red, red)) {
4130
+ background-color: color-mix(in oklab, var(--color-amber-400) 10%, transparent);
4131
+ }
4132
+ }
4133
+ }
4039
4134
  .dark\:bg-amber-900\/50 {
4040
4135
  @media (prefers-color-scheme: dark) {
4041
4136
  background-color: color-mix(in srgb, oklch(41.4% 0.112 45.904) 50%, transparent);
@@ -4076,6 +4171,14 @@
4076
4171
  }
4077
4172
  }
4078
4173
  }
4174
+ .dark\:bg-sky-500\/20 {
4175
+ @media (prefers-color-scheme: dark) {
4176
+ background-color: color-mix(in srgb, oklch(68.5% 0.169 237.323) 20%, transparent);
4177
+ @supports (color: color-mix(in lab, red, red)) {
4178
+ background-color: color-mix(in oklab, var(--color-sky-500) 20%, transparent);
4179
+ }
4180
+ }
4181
+ }
4079
4182
  .dark\:bg-stone-700 {
4080
4183
  @media (prefers-color-scheme: dark) {
4081
4184
  background-color: var(--color-stone-700);
@@ -4171,6 +4274,11 @@
4171
4274
  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
4172
4275
  }
4173
4276
  }
4277
+ .dark\:text-amber-200 {
4278
+ @media (prefers-color-scheme: dark) {
4279
+ color: var(--color-amber-200);
4280
+ }
4281
+ }
4174
4282
  .dark\:text-amber-400 {
4175
4283
  @media (prefers-color-scheme: dark) {
4176
4284
  color: var(--color-amber-400);
@@ -4434,6 +4542,18 @@
4434
4542
  }
4435
4543
  }
4436
4544
  }
4545
+ .dark\:hover\:bg-amber-400\/15 {
4546
+ @media (prefers-color-scheme: dark) {
4547
+ &:hover {
4548
+ @media (hover: hover) {
4549
+ background-color: color-mix(in srgb, oklch(82.8% 0.189 84.429) 15%, transparent);
4550
+ @supports (color: color-mix(in lab, red, red)) {
4551
+ background-color: color-mix(in oklab, var(--color-amber-400) 15%, transparent);
4552
+ }
4553
+ }
4554
+ }
4555
+ }
4556
+ }
4437
4557
  .dark\:hover\:bg-red-500\/10 {
4438
4558
  @media (prefers-color-scheme: dark) {
4439
4559
  &:hover {
@@ -7032,6 +7152,25 @@ dialog.modal {
7032
7152
  color: var(--color-amber-400);
7033
7153
  }
7034
7154
  }
7155
+ [data-controller="file-upload"] {
7156
+ [data-file-upload-target="documentPreview"] {
7157
+ display: none;
7158
+ }
7159
+ [data-file-icon] {
7160
+ display: none;
7161
+ }
7162
+ [data-file-upload-target="previewWrapper"]:not([data-file-kind="image"]) {
7163
+ [data-file-upload-target="preview"] {
7164
+ display: none;
7165
+ }
7166
+ [data-file-upload-target="documentPreview"] {
7167
+ display: flex;
7168
+ }
7169
+ }
7170
+ [data-file-kind="pdf"] [data-file-icon="pdf"], [data-file-kind="audio"] [data-file-icon="audio"], [data-file-kind="video"] [data-file-icon="video"], [data-file-kind="file"] [data-file-icon="file"] {
7171
+ display: block;
7172
+ }
7173
+ }
7035
7174
  :root {
7036
7175
  --highlight-1: rgb(136, 118, 38);
7037
7176
  --highlight-2: rgb(185, 94, 6);
@@ -7091,11 +7230,13 @@ dialog.modal {
7091
7230
  }
7092
7231
  }
7093
7232
  lexxy-toolbar {
7233
+ position: relative;
7094
7234
  display: flex;
7095
- flex-wrap: wrap;
7235
+ flex-wrap: nowrap;
7096
7236
  align-items: center;
7097
7237
  gap: calc(var(--spacing) * 1);
7098
7238
  padding: calc(var(--spacing) * 2);
7239
+ max-width: 100%;
7099
7240
  border-bottom-style: var(--tw-border-style);
7100
7241
  border-bottom-width: 1px;
7101
7242
  border-color: color-mix(in srgb, oklch(14.7% 0.004 49.25) 10%, transparent);
@@ -7118,22 +7259,8 @@ dialog.modal {
7118
7259
  border-top-left-radius: var(--radius-xl);
7119
7260
  border-top-right-radius: var(--radius-xl);
7120
7261
  }
7121
- lexxy-toolbar [data-toolbar-group] {
7122
- display: flex;
7123
- align-items: center;
7124
- }
7125
- lexxy-toolbar [data-toolbar-group]:not(:last-child)::after {
7126
- content: "";
7127
- margin-inline: calc(var(--spacing) * 2);
7128
- height: calc(var(--spacing) * 5);
7129
- width: 1px;
7130
- background-color: var(--color-stone-300);
7131
- @media (prefers-color-scheme: dark) {
7132
- background-color: color-mix(in srgb, #fff 20%, transparent);
7133
- @supports (color: color-mix(in lab, red, red)) {
7134
- background-color: color-mix(in oklab, var(--color-white) 20%, transparent);
7135
- }
7136
- }
7262
+ lexxy-toolbar > * {
7263
+ flex: none;
7137
7264
  }
7138
7265
  lexxy-toolbar button, lexxy-toolbar summary {
7139
7266
  display: inline-flex;
@@ -7174,11 +7301,17 @@ dialog.modal {
7174
7301
  &:disabled {
7175
7302
  opacity: 40%;
7176
7303
  }
7304
+ &[aria-disabled="true"] {
7305
+ pointer-events: none;
7306
+ }
7307
+ &[aria-disabled="true"] {
7308
+ opacity: 40%;
7309
+ }
7177
7310
  transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
7178
7311
  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
7179
7312
  transition-duration: var(--tw-duration, var(--default-transition-duration));
7180
7313
  }
7181
- lexxy-toolbar button[aria-pressed="true"], lexxy-toolbar button.active, lexxy-toolbar details[open] > summary {
7314
+ lexxy-toolbar button[aria-pressed="true"], lexxy-toolbar button.active {
7182
7315
  background-color: var(--color-stone-200);
7183
7316
  color: var(--color-stone-900);
7184
7317
  @media (prefers-color-scheme: dark) {
@@ -7197,6 +7330,46 @@ dialog.modal {
7197
7330
  color: inherit;
7198
7331
  fill: currentColor;
7199
7332
  }
7333
+ lexxy-toolbar .lexxy-editor__toolbar-button--chevron {
7334
+ width: auto;
7335
+ gap: calc(var(--spacing) * 1);
7336
+ padding-inline: calc(var(--spacing) * 1.5);
7337
+ }
7338
+ lexxy-toolbar .lexxy-editor__toolbar-button--chevron::after {
7339
+ content: "";
7340
+ width: calc(var(--spacing) * 1.5);
7341
+ height: calc(var(--spacing) * 1.5);
7342
+ rotate: 45deg;
7343
+ border-inline-end-style: var(--tw-border-style);
7344
+ border-inline-end-width: 2px;
7345
+ border-bottom-style: var(--tw-border-style);
7346
+ border-bottom-width: 2px;
7347
+ border-color: currentcolor;
7348
+ opacity: 50%;
7349
+ margin-block-start: -0.15rem;
7350
+ }
7351
+ lexxy-toolbar > button.lexxy-editor__toolbar-group-end, lexxy-toolbar > lexxy-link-dropdown > button.lexxy-editor__toolbar-group-end {
7352
+ position: relative;
7353
+ margin-inline-end: calc(var(--spacing) * 2.5);
7354
+ }
7355
+ lexxy-toolbar > button.lexxy-editor__toolbar-group-end::after, lexxy-toolbar > lexxy-link-dropdown > button.lexxy-editor__toolbar-group-end::after {
7356
+ content: "";
7357
+ position: absolute;
7358
+ inset-block: calc(var(--spacing) * 1);
7359
+ width: 1px;
7360
+ inset-inline-end: -0.3125rem;
7361
+ pointer-events: none;
7362
+ background-color: var(--color-stone-300);
7363
+ @media (prefers-color-scheme: dark) {
7364
+ background-color: color-mix(in srgb, #fff 20%, transparent);
7365
+ @supports (color: color-mix(in lab, red, red)) {
7366
+ background-color: color-mix(in oklab, var(--color-white) 20%, transparent);
7367
+ }
7368
+ }
7369
+ }
7370
+ lexxy-toolbar .lexxy-editor__toolbar-button--push-right {
7371
+ margin-inline-start: auto;
7372
+ }
7200
7373
  lexxy-editor [contenteditable="true"] {
7201
7374
  display: block;
7202
7375
  min-height: calc(var(--spacing) * 48);
@@ -7228,25 +7401,12 @@ dialog.modal {
7228
7401
  -webkit-user-select: none;
7229
7402
  user-select: none;
7230
7403
  }
7231
- .lexxy-editor__toolbar-dropdown > summary {
7232
- list-style: none;
7233
- cursor: pointer;
7234
- }
7235
- .lexxy-editor__toolbar-dropdown > summary::-webkit-details-marker {
7236
- display: none;
7237
- }
7238
- .lexxy-editor__toolbar-dropdown > summary::marker {
7239
- display: none;
7240
- content: "";
7241
- }
7242
- .lexxy-editor__toolbar-dropdown-content {
7243
- --dropdown-padding: calc(var(--spacing) * 3);
7244
- --dropdown-gap: calc(var(--spacing) * 1.5);
7404
+ lexxy-toolbar [data-dropdown-panel] {
7245
7405
  position: absolute;
7246
- z-index: 10;
7247
- display: flex;
7248
- gap: var(--dropdown-gap);
7249
- padding: var(--dropdown-padding);
7406
+ inset-inline-start: calc(var(--spacing) * 0);
7407
+ top: 100%;
7408
+ z-index: 20;
7409
+ margin-top: calc(var(--spacing) * 1);
7250
7410
  background-color: var(--color-white);
7251
7411
  @media (prefers-color-scheme: dark) {
7252
7412
  background-color: var(--color-stone-800);
@@ -7261,16 +7421,18 @@ dialog.modal {
7261
7421
  }
7262
7422
  }
7263
7423
  border-radius: var(--radius-md);
7424
+ border-start-start-radius: 0;
7425
+ --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
7426
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
7264
7427
  color: var(--color-stone-900);
7265
7428
  @media (prefers-color-scheme: dark) {
7266
7429
  color: var(--color-white);
7267
7430
  }
7268
- inset-inline-start: calc(var(--spacing) * 0);
7269
- top: calc(var(--spacing) * 8);
7270
- max-width: 40ch;
7271
- border-start-start-radius: 0;
7272
7431
  }
7273
- .lexxy-editor__toolbar-dropdown:is([open]) > summary.lexxy-editor__toolbar-button {
7432
+ lexxy-toolbar [data-dropdown-panel][hidden] {
7433
+ display: none;
7434
+ }
7435
+ .lexxy-editor__toolbar-dropdown > [data-dropdown-trigger][aria-expanded="true"], .lexxy-editor__toolbar-dropdown > [data-dropdown-trigger][aria-expanded="true"]:hover {
7274
7436
  background-color: var(--color-sky-100);
7275
7437
  @media (prefers-color-scheme: dark) {
7276
7438
  background-color: color-mix(in srgb, oklch(68.5% 0.169 237.323) 20%, transparent);
@@ -7281,51 +7443,12 @@ dialog.modal {
7281
7443
  border-end-end-radius: 0;
7282
7444
  border-end-start-radius: 0;
7283
7445
  }
7284
- .lexxy-editor__toolbar-dropdown:is([open]) > summary.lexxy-editor__toolbar-button:hover {
7285
- background-color: var(--color-sky-100);
7286
- @media (prefers-color-scheme: dark) {
7287
- background-color: color-mix(in srgb, oklch(68.5% 0.169 237.323) 20%, transparent);
7288
- @supports (color: color-mix(in lab, red, red)) {
7289
- background-color: color-mix(in oklab, var(--color-sky-500) 20%, transparent);
7290
- }
7291
- }
7292
- }
7293
- [overflowing] .lexxy-editor__toolbar-dropdown {
7294
- position: static;
7295
- }
7296
- [overflowing] .lexxy-editor__toolbar-dropdown-content {
7297
- --dropdown-padding: calc(var(--spacing) * 2);
7298
- inset-inline-start: var(--dropdown-padding);
7299
- inset-inline-end: var(--dropdown-padding);
7300
- }
7301
- .lexxy-editor__toolbar-dropdown-list {
7302
- position: absolute;
7303
- z-index: 10;
7446
+ [data-dropdown-panel].lexxy-editor__toolbar-dropdown-list {
7304
7447
  display: flex;
7448
+ min-width: 12rem;
7305
7449
  flex-direction: column;
7450
+ gap: calc(var(--spacing) * 0.5);
7306
7451
  padding: calc(var(--spacing) * 1);
7307
- background-color: var(--color-white);
7308
- @media (prefers-color-scheme: dark) {
7309
- background-color: var(--color-stone-800);
7310
- }
7311
- border-style: var(--tw-border-style);
7312
- border-width: 2px;
7313
- border-color: var(--color-sky-200);
7314
- @media (prefers-color-scheme: dark) {
7315
- border-color: color-mix(in srgb, oklch(68.5% 0.169 237.323) 30%, transparent);
7316
- @supports (color: color-mix(in lab, red, red)) {
7317
- border-color: color-mix(in oklab, var(--color-sky-500) 30%, transparent);
7318
- }
7319
- }
7320
- border-radius: var(--radius-md);
7321
- border-start-start-radius: 0;
7322
- color: var(--color-stone-900);
7323
- @media (prefers-color-scheme: dark) {
7324
- color: var(--color-white);
7325
- }
7326
- inset-inline-start: calc(var(--spacing) * 0);
7327
- top: calc(var(--spacing) * 8);
7328
- min-width: 12rem;
7329
7452
  }
7330
7453
  .lexxy-editor__toolbar-dropdown-list button {
7331
7454
  height: auto;
@@ -7392,16 +7515,25 @@ dialog.modal {
7392
7515
  }
7393
7516
  }
7394
7517
  }
7395
- lexxy-link-dropdown {
7396
- min-width: 22rem;
7397
- gap: calc(var(--spacing) * 2);
7518
+ .lexxy-editor__toolbar-overflow [data-dropdown-panel] {
7519
+ inset-inline-start: auto;
7520
+ inset-inline-end: calc(var(--spacing) * 0);
7521
+ border-start-start-radius: var(--radius-md);
7522
+ border-start-end-radius: 0;
7398
7523
  }
7399
- [overflowing] lexxy-link-dropdown {
7400
- min-width: calc(var(--spacing) * 0);
7401
- flex-direction: column;
7524
+ [data-dropdown-panel].lexxy-editor__toolbar-overflow-menu {
7525
+ display: grid;
7526
+ grid-template-columns: repeat(5, minmax(0, 1fr));
7527
+ justify-items: center;
7528
+ gap: calc(var(--spacing) * 1);
7529
+ padding: calc(var(--spacing) * 2);
7402
7530
  }
7403
- [overflowing] lexxy-link-dropdown .lexxy-editor__toolbar-dropdown-actions {
7404
- margin-top: calc(var(--spacing) * 2);
7531
+ lexxy-link-dropdown [data-dropdown-panel] {
7532
+ display: flex;
7533
+ min-width: 22rem;
7534
+ align-items: center;
7535
+ gap: calc(var(--spacing) * 2);
7536
+ padding: calc(var(--spacing) * 2);
7405
7537
  }
7406
7538
  lexxy-link-dropdown input[type="url"] {
7407
7539
  min-width: calc(var(--spacing) * 0);
@@ -7524,13 +7656,14 @@ dialog.modal {
7524
7656
  }
7525
7657
  }
7526
7658
  }
7527
- lexxy-highlight-dropdown {
7528
- --button-size: calc(var(--spacing) * 8);
7659
+ lexxy-highlight-dropdown [data-dropdown-panel] {
7529
7660
  display: flex;
7530
7661
  flex-direction: column;
7531
7662
  gap: calc(var(--spacing) * 2);
7663
+ padding: calc(var(--spacing) * 2);
7532
7664
  }
7533
7665
  lexxy-highlight-dropdown .lexxy-highlight-colors {
7666
+ --button-size: calc(var(--spacing) * 7);
7534
7667
  display: grid;
7535
7668
  grid-template-columns: repeat(var(--max-colors, 9), var(--button-size));
7536
7669
  grid-template-rows: repeat(2, var(--button-size));
@@ -7539,11 +7672,10 @@ dialog.modal {
7539
7672
  }
7540
7673
  lexxy-highlight-dropdown .lexxy-highlight-button {
7541
7674
  position: relative;
7542
- aspect-ratio: 1 / 1;
7543
- width: calc(var(--spacing) * 8);
7544
- height: calc(var(--spacing) * 8);
7545
7675
  border-radius: var(--radius-md);
7546
7676
  padding: calc(var(--spacing) * 0);
7677
+ width: var(--button-size);
7678
+ height: var(--button-size);
7547
7679
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
7548
7680
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
7549
7681
  --tw-ring-color: var(--color-stone-300);
@@ -7568,8 +7700,8 @@ dialog.modal {
7568
7700
  display: flex;
7569
7701
  align-items: center;
7570
7702
  justify-content: center;
7571
- font-size: var(--text-sm);
7572
- line-height: var(--tw-leading, var(--text-sm--line-height));
7703
+ font-size: var(--text-xs);
7704
+ line-height: var(--tw-leading, var(--text-xs--line-height));
7573
7705
  --tw-leading: 1;
7574
7706
  line-height: 1;
7575
7707
  --tw-font-weight: var(--font-weight-semibold);
@@ -7589,7 +7721,7 @@ dialog.modal {
7589
7721
  content: "✓";
7590
7722
  }
7591
7723
  lexxy-highlight-dropdown .lexxy-editor__toolbar-dropdown-reset {
7592
- margin-top: calc(var(--spacing) * 2);
7724
+ margin-top: calc(var(--spacing) * 1);
7593
7725
  width: 100%;
7594
7726
  white-space: nowrap;
7595
7727
  @layer components {
@@ -7745,8 +7877,25 @@ dialog.modal {
7745
7877
  lexxy-highlight-dropdown .lexxy-editor__toolbar-dropdown-reset[disabled] {
7746
7878
  display: none;
7747
7879
  }
7748
- [overflowing] lexxy-highlight-dropdown {
7749
- width: fit-content;
7880
+ lexxy-toolbar[overflowing] .lexxy-editor__toolbar-dropdown {
7881
+ position: static;
7882
+ }
7883
+ lexxy-toolbar[overflowing] [data-dropdown-panel] {
7884
+ inset-inline-start: calc(var(--spacing) * 2);
7885
+ inset-inline-end: calc(var(--spacing) * 2);
7886
+ width: auto;
7887
+ border-radius: var(--radius-md);
7888
+ }
7889
+ lexxy-toolbar[overflowing] [data-dropdown-trigger][aria-expanded="true"] {
7890
+ border-radius: var(--radius-md);
7891
+ }
7892
+ lexxy-toolbar[overflowing] lexxy-link-dropdown [data-dropdown-panel] {
7893
+ min-width: calc(var(--spacing) * 0);
7894
+ flex-direction: column;
7895
+ align-items: stretch;
7896
+ }
7897
+ lexxy-toolbar[overflowing] lexxy-link-dropdown .lexxy-editor__toolbar-dropdown-actions {
7898
+ margin-top: calc(var(--spacing) * 2);
7750
7899
  }
7751
7900
  lexxy-editor .attachment__progress {
7752
7901
  position: absolute;
@@ -8957,6 +9106,10 @@ dialog.modal {
8957
9106
  syntax: "*";
8958
9107
  inherits: false;
8959
9108
  }
9109
+ @property --tw-leading {
9110
+ syntax: "*";
9111
+ inherits: false;
9112
+ }
8960
9113
  @property --tw-content {
8961
9114
  syntax: "*";
8962
9115
  initial-value: "";
@@ -8982,10 +9135,6 @@ dialog.modal {
8982
9135
  syntax: "*";
8983
9136
  inherits: false;
8984
9137
  }
8985
- @property --tw-leading {
8986
- syntax: "*";
8987
- inherits: false;
8988
- }
8989
9138
  @keyframes spin {
8990
9139
  to {
8991
9140
  transform: rotate(360deg);
@@ -9074,13 +9223,13 @@ dialog.modal {
9074
9223
  --tw-gradient-via-position: 50%;
9075
9224
  --tw-gradient-to-position: 100%;
9076
9225
  --tw-tracking: initial;
9226
+ --tw-leading: initial;
9077
9227
  --tw-content: "";
9078
9228
  --tw-ordinal: initial;
9079
9229
  --tw-slashed-zero: initial;
9080
9230
  --tw-numeric-figure: initial;
9081
9231
  --tw-numeric-spacing: initial;
9082
9232
  --tw-numeric-fraction: initial;
9083
- --tw-leading: initial;
9084
9233
  }
9085
9234
  }
9086
9235
  }
@@ -29,6 +29,7 @@
29
29
  @import './components/selection-list.css';
30
30
  @import './components/file-scope-picker.css';
31
31
  @import './components/content-type-card.css';
32
+ @import './components/file-upload.css';
32
33
  @import './lexxy.css';
33
34
 
34
35
  @plugin '@tailwindcss/typography';
@@ -0,0 +1,26 @@
1
+ [data-controller="file-upload"] {
2
+ [data-file-upload-target="documentPreview"] {
3
+ @apply hidden;
4
+ }
5
+
6
+ [data-file-icon] {
7
+ @apply hidden;
8
+ }
9
+
10
+ [data-file-upload-target="previewWrapper"]:not([data-file-kind="image"]) {
11
+ [data-file-upload-target="preview"] {
12
+ @apply hidden;
13
+ }
14
+
15
+ [data-file-upload-target="documentPreview"] {
16
+ @apply flex;
17
+ }
18
+ }
19
+
20
+ [data-file-kind="pdf"] [data-file-icon="pdf"],
21
+ [data-file-kind="audio"] [data-file-icon="audio"],
22
+ [data-file-kind="video"] [data-file-icon="video"],
23
+ [data-file-kind="file"] [data-file-icon="file"] {
24
+ @apply block;
25
+ }
26
+ }