iron-cms 0.17.3 → 0.18.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 (144) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +88 -4
  3. data/app/assets/builds/iron.css +236 -106
  4. data/app/assets/tailwind/iron/lexxy.css +111 -87
  5. data/app/controllers/concerns/iron/schema_editing.rb +19 -0
  6. data/app/controllers/concerns/iron/web_page.rb +3 -1
  7. data/app/controllers/iron/api/schema/base_controller.rb +25 -0
  8. data/app/controllers/iron/api/schema/block_definitions_controller.rb +49 -0
  9. data/app/controllers/iron/api/schema/content_types_controller.rb +64 -0
  10. data/app/controllers/iron/api/schema/field_definitions_controller.rb +88 -0
  11. data/app/controllers/iron/api/schema/locales_controller.rb +52 -0
  12. data/app/controllers/iron/application_controller.rb +1 -1
  13. data/app/controllers/iron/block_definitions_controller.rb +1 -0
  14. data/app/controllers/iron/content_types_controller.rb +1 -0
  15. data/app/controllers/iron/field_definitions_controller.rb +2 -1
  16. data/app/controllers/iron/first_runs_controller.rb +1 -1
  17. data/app/controllers/iron/locales_controller.rb +1 -0
  18. data/app/controllers/iron/sessions_controller.rb +1 -1
  19. data/app/helpers/iron/avatar_helper.rb +24 -2
  20. data/app/models/iron/account.rb +1 -1
  21. data/app/models/iron/api/openapi_spec.rb +37 -15
  22. data/app/models/iron/block_definition/exportable.rb +1 -1
  23. data/app/models/iron/block_definition.rb +3 -1
  24. data/app/models/iron/content.rb +176 -0
  25. data/app/models/iron/content_type/exportable.rb +3 -1
  26. data/app/models/iron/content_type/importable.rb +1 -1
  27. data/app/models/iron/content_type.rb +6 -1
  28. data/app/models/iron/entry/content_assignable.rb +10 -2
  29. data/app/models/iron/entry/presentable.rb +1 -1
  30. data/app/models/iron/entry/web_publishable.rb +17 -3
  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 +4 -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 +2 -2
  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/published_page_constraint.rb +33 -0
  140. data/lib/iron/routing.rb +2 -26
  141. data/lib/iron/version.rb +1 -1
  142. data/lib/tasks/iron_content.rake +82 -0
  143. data/lib/tasks/iron_schema.rake +45 -0
  144. 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 {
@@ -7110,11 +7230,13 @@ dialog.modal {
7110
7230
  }
7111
7231
  }
7112
7232
  lexxy-toolbar {
7233
+ position: relative;
7113
7234
  display: flex;
7114
- flex-wrap: wrap;
7235
+ flex-wrap: nowrap;
7115
7236
  align-items: center;
7116
7237
  gap: calc(var(--spacing) * 1);
7117
7238
  padding: calc(var(--spacing) * 2);
7239
+ max-width: 100%;
7118
7240
  border-bottom-style: var(--tw-border-style);
7119
7241
  border-bottom-width: 1px;
7120
7242
  border-color: color-mix(in srgb, oklch(14.7% 0.004 49.25) 10%, transparent);
@@ -7137,22 +7259,8 @@ dialog.modal {
7137
7259
  border-top-left-radius: var(--radius-xl);
7138
7260
  border-top-right-radius: var(--radius-xl);
7139
7261
  }
7140
- lexxy-toolbar [data-toolbar-group] {
7141
- display: flex;
7142
- align-items: center;
7143
- }
7144
- lexxy-toolbar [data-toolbar-group]:not(:last-child)::after {
7145
- content: "";
7146
- margin-inline: calc(var(--spacing) * 2);
7147
- height: calc(var(--spacing) * 5);
7148
- width: 1px;
7149
- background-color: var(--color-stone-300);
7150
- @media (prefers-color-scheme: dark) {
7151
- background-color: color-mix(in srgb, #fff 20%, transparent);
7152
- @supports (color: color-mix(in lab, red, red)) {
7153
- background-color: color-mix(in oklab, var(--color-white) 20%, transparent);
7154
- }
7155
- }
7262
+ lexxy-toolbar > * {
7263
+ flex: none;
7156
7264
  }
7157
7265
  lexxy-toolbar button, lexxy-toolbar summary {
7158
7266
  display: inline-flex;
@@ -7193,11 +7301,17 @@ dialog.modal {
7193
7301
  &:disabled {
7194
7302
  opacity: 40%;
7195
7303
  }
7304
+ &[aria-disabled="true"] {
7305
+ pointer-events: none;
7306
+ }
7307
+ &[aria-disabled="true"] {
7308
+ opacity: 40%;
7309
+ }
7196
7310
  transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
7197
7311
  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
7198
7312
  transition-duration: var(--tw-duration, var(--default-transition-duration));
7199
7313
  }
7200
- 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 {
7201
7315
  background-color: var(--color-stone-200);
7202
7316
  color: var(--color-stone-900);
7203
7317
  @media (prefers-color-scheme: dark) {
@@ -7216,6 +7330,46 @@ dialog.modal {
7216
7330
  color: inherit;
7217
7331
  fill: currentColor;
7218
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
+ }
7219
7373
  lexxy-editor [contenteditable="true"] {
7220
7374
  display: block;
7221
7375
  min-height: calc(var(--spacing) * 48);
@@ -7247,25 +7401,12 @@ dialog.modal {
7247
7401
  -webkit-user-select: none;
7248
7402
  user-select: none;
7249
7403
  }
7250
- .lexxy-editor__toolbar-dropdown > summary {
7251
- list-style: none;
7252
- cursor: pointer;
7253
- }
7254
- .lexxy-editor__toolbar-dropdown > summary::-webkit-details-marker {
7255
- display: none;
7256
- }
7257
- .lexxy-editor__toolbar-dropdown > summary::marker {
7258
- display: none;
7259
- content: "";
7260
- }
7261
- .lexxy-editor__toolbar-dropdown-content {
7262
- --dropdown-padding: calc(var(--spacing) * 3);
7263
- --dropdown-gap: calc(var(--spacing) * 1.5);
7404
+ lexxy-toolbar [data-dropdown-panel] {
7264
7405
  position: absolute;
7265
- z-index: 10;
7266
- display: flex;
7267
- gap: var(--dropdown-gap);
7268
- 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);
7269
7410
  background-color: var(--color-white);
7270
7411
  @media (prefers-color-scheme: dark) {
7271
7412
  background-color: var(--color-stone-800);
@@ -7280,16 +7421,18 @@ dialog.modal {
7280
7421
  }
7281
7422
  }
7282
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);
7283
7427
  color: var(--color-stone-900);
7284
7428
  @media (prefers-color-scheme: dark) {
7285
7429
  color: var(--color-white);
7286
7430
  }
7287
- inset-inline-start: calc(var(--spacing) * 0);
7288
- top: calc(var(--spacing) * 8);
7289
- max-width: 40ch;
7290
- border-start-start-radius: 0;
7291
7431
  }
7292
- .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 {
7293
7436
  background-color: var(--color-sky-100);
7294
7437
  @media (prefers-color-scheme: dark) {
7295
7438
  background-color: color-mix(in srgb, oklch(68.5% 0.169 237.323) 20%, transparent);
@@ -7300,51 +7443,12 @@ dialog.modal {
7300
7443
  border-end-end-radius: 0;
7301
7444
  border-end-start-radius: 0;
7302
7445
  }
7303
- .lexxy-editor__toolbar-dropdown:is([open]) > summary.lexxy-editor__toolbar-button:hover {
7304
- background-color: var(--color-sky-100);
7305
- @media (prefers-color-scheme: dark) {
7306
- background-color: color-mix(in srgb, oklch(68.5% 0.169 237.323) 20%, transparent);
7307
- @supports (color: color-mix(in lab, red, red)) {
7308
- background-color: color-mix(in oklab, var(--color-sky-500) 20%, transparent);
7309
- }
7310
- }
7311
- }
7312
- [overflowing] .lexxy-editor__toolbar-dropdown {
7313
- position: static;
7314
- }
7315
- [overflowing] .lexxy-editor__toolbar-dropdown-content {
7316
- --dropdown-padding: calc(var(--spacing) * 2);
7317
- inset-inline-start: var(--dropdown-padding);
7318
- inset-inline-end: var(--dropdown-padding);
7319
- }
7320
- .lexxy-editor__toolbar-dropdown-list {
7321
- position: absolute;
7322
- z-index: 10;
7446
+ [data-dropdown-panel].lexxy-editor__toolbar-dropdown-list {
7323
7447
  display: flex;
7448
+ min-width: 12rem;
7324
7449
  flex-direction: column;
7450
+ gap: calc(var(--spacing) * 0.5);
7325
7451
  padding: calc(var(--spacing) * 1);
7326
- background-color: var(--color-white);
7327
- @media (prefers-color-scheme: dark) {
7328
- background-color: var(--color-stone-800);
7329
- }
7330
- border-style: var(--tw-border-style);
7331
- border-width: 2px;
7332
- border-color: var(--color-sky-200);
7333
- @media (prefers-color-scheme: dark) {
7334
- border-color: color-mix(in srgb, oklch(68.5% 0.169 237.323) 30%, transparent);
7335
- @supports (color: color-mix(in lab, red, red)) {
7336
- border-color: color-mix(in oklab, var(--color-sky-500) 30%, transparent);
7337
- }
7338
- }
7339
- border-radius: var(--radius-md);
7340
- border-start-start-radius: 0;
7341
- color: var(--color-stone-900);
7342
- @media (prefers-color-scheme: dark) {
7343
- color: var(--color-white);
7344
- }
7345
- inset-inline-start: calc(var(--spacing) * 0);
7346
- top: calc(var(--spacing) * 8);
7347
- min-width: 12rem;
7348
7452
  }
7349
7453
  .lexxy-editor__toolbar-dropdown-list button {
7350
7454
  height: auto;
@@ -7411,16 +7515,25 @@ dialog.modal {
7411
7515
  }
7412
7516
  }
7413
7517
  }
7414
- lexxy-link-dropdown {
7415
- min-width: 22rem;
7416
- 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;
7417
7523
  }
7418
- [overflowing] lexxy-link-dropdown {
7419
- min-width: calc(var(--spacing) * 0);
7420
- 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);
7421
7530
  }
7422
- [overflowing] lexxy-link-dropdown .lexxy-editor__toolbar-dropdown-actions {
7423
- 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);
7424
7537
  }
7425
7538
  lexxy-link-dropdown input[type="url"] {
7426
7539
  min-width: calc(var(--spacing) * 0);
@@ -7543,13 +7656,14 @@ dialog.modal {
7543
7656
  }
7544
7657
  }
7545
7658
  }
7546
- lexxy-highlight-dropdown {
7547
- --button-size: calc(var(--spacing) * 8);
7659
+ lexxy-highlight-dropdown [data-dropdown-panel] {
7548
7660
  display: flex;
7549
7661
  flex-direction: column;
7550
7662
  gap: calc(var(--spacing) * 2);
7663
+ padding: calc(var(--spacing) * 2);
7551
7664
  }
7552
7665
  lexxy-highlight-dropdown .lexxy-highlight-colors {
7666
+ --button-size: calc(var(--spacing) * 7);
7553
7667
  display: grid;
7554
7668
  grid-template-columns: repeat(var(--max-colors, 9), var(--button-size));
7555
7669
  grid-template-rows: repeat(2, var(--button-size));
@@ -7558,11 +7672,10 @@ dialog.modal {
7558
7672
  }
7559
7673
  lexxy-highlight-dropdown .lexxy-highlight-button {
7560
7674
  position: relative;
7561
- aspect-ratio: 1 / 1;
7562
- width: calc(var(--spacing) * 8);
7563
- height: calc(var(--spacing) * 8);
7564
7675
  border-radius: var(--radius-md);
7565
7676
  padding: calc(var(--spacing) * 0);
7677
+ width: var(--button-size);
7678
+ height: var(--button-size);
7566
7679
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
7567
7680
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
7568
7681
  --tw-ring-color: var(--color-stone-300);
@@ -7587,8 +7700,8 @@ dialog.modal {
7587
7700
  display: flex;
7588
7701
  align-items: center;
7589
7702
  justify-content: center;
7590
- font-size: var(--text-sm);
7591
- 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));
7592
7705
  --tw-leading: 1;
7593
7706
  line-height: 1;
7594
7707
  --tw-font-weight: var(--font-weight-semibold);
@@ -7608,7 +7721,7 @@ dialog.modal {
7608
7721
  content: "✓";
7609
7722
  }
7610
7723
  lexxy-highlight-dropdown .lexxy-editor__toolbar-dropdown-reset {
7611
- margin-top: calc(var(--spacing) * 2);
7724
+ margin-top: calc(var(--spacing) * 1);
7612
7725
  width: 100%;
7613
7726
  white-space: nowrap;
7614
7727
  @layer components {
@@ -7764,8 +7877,25 @@ dialog.modal {
7764
7877
  lexxy-highlight-dropdown .lexxy-editor__toolbar-dropdown-reset[disabled] {
7765
7878
  display: none;
7766
7879
  }
7767
- [overflowing] lexxy-highlight-dropdown {
7768
- 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);
7769
7899
  }
7770
7900
  lexxy-editor .attachment__progress {
7771
7901
  position: absolute;
@@ -8976,6 +9106,10 @@ dialog.modal {
8976
9106
  syntax: "*";
8977
9107
  inherits: false;
8978
9108
  }
9109
+ @property --tw-leading {
9110
+ syntax: "*";
9111
+ inherits: false;
9112
+ }
8979
9113
  @property --tw-content {
8980
9114
  syntax: "*";
8981
9115
  initial-value: "";
@@ -9001,10 +9135,6 @@ dialog.modal {
9001
9135
  syntax: "*";
9002
9136
  inherits: false;
9003
9137
  }
9004
- @property --tw-leading {
9005
- syntax: "*";
9006
- inherits: false;
9007
- }
9008
9138
  @keyframes spin {
9009
9139
  to {
9010
9140
  transform: rotate(360deg);
@@ -9093,13 +9223,13 @@ dialog.modal {
9093
9223
  --tw-gradient-via-position: 50%;
9094
9224
  --tw-gradient-to-position: 100%;
9095
9225
  --tw-tracking: initial;
9226
+ --tw-leading: initial;
9096
9227
  --tw-content: "";
9097
9228
  --tw-ordinal: initial;
9098
9229
  --tw-slashed-zero: initial;
9099
9230
  --tw-numeric-figure: initial;
9100
9231
  --tw-numeric-spacing: initial;
9101
9232
  --tw-numeric-fraction: initial;
9102
- --tw-leading: initial;
9103
9233
  }
9104
9234
  }
9105
9235
  }