@tinya-code/gas-admin-ui 0.2.0-alpha.15 → 0.2.0-alpha.17

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 (368) hide show
  1. package/fesm2022/tinya-code-gas-admin-ui-badge-EeCA_l-o.mjs +84 -0
  2. package/fesm2022/tinya-code-gas-admin-ui-badge-EeCA_l-o.mjs.map +1 -0
  3. package/fesm2022/tinya-code-gas-admin-ui-bar-chart-G7sEMSBY.mjs +140 -0
  4. package/fesm2022/tinya-code-gas-admin-ui-bar-chart-G7sEMSBY.mjs.map +1 -0
  5. package/fesm2022/tinya-code-gas-admin-ui-boolean-B2ASKL0E.mjs +113 -0
  6. package/fesm2022/tinya-code-gas-admin-ui-boolean-B2ASKL0E.mjs.map +1 -0
  7. package/fesm2022/tinya-code-gas-admin-ui-button-BQjNW8KB.mjs +163 -0
  8. package/fesm2022/tinya-code-gas-admin-ui-button-BQjNW8KB.mjs.map +1 -0
  9. package/fesm2022/tinya-code-gas-admin-ui-calendar-view-DCY8bj2V.mjs +1027 -0
  10. package/fesm2022/tinya-code-gas-admin-ui-calendar-view-DCY8bj2V.mjs.map +1 -0
  11. package/fesm2022/tinya-code-gas-admin-ui-chart-line-BjdlKHoH.mjs +278 -0
  12. package/fesm2022/tinya-code-gas-admin-ui-chart-line-BjdlKHoH.mjs.map +1 -0
  13. package/fesm2022/tinya-code-gas-admin-ui-color-Dljh_By3.mjs +107 -0
  14. package/fesm2022/tinya-code-gas-admin-ui-color-Dljh_By3.mjs.map +1 -0
  15. package/fesm2022/tinya-code-gas-admin-ui-condition-evaluator-DY2k1M3C.mjs +101 -0
  16. package/fesm2022/tinya-code-gas-admin-ui-condition-evaluator-DY2k1M3C.mjs.map +1 -0
  17. package/fesm2022/tinya-code-gas-admin-ui-currency-BvuF3Z63.mjs +141 -0
  18. package/fesm2022/tinya-code-gas-admin-ui-currency-BvuF3Z63.mjs.map +1 -0
  19. package/fesm2022/tinya-code-gas-admin-ui-data-source.service-96FSbN72.mjs +88 -0
  20. package/fesm2022/tinya-code-gas-admin-ui-data-source.service-96FSbN72.mjs.map +1 -0
  21. package/fesm2022/tinya-code-gas-admin-ui-date-1SJGXZrd.mjs +107 -0
  22. package/fesm2022/tinya-code-gas-admin-ui-date-1SJGXZrd.mjs.map +1 -0
  23. package/fesm2022/tinya-code-gas-admin-ui-display-badge-fwk6sDU7.mjs +140 -0
  24. package/fesm2022/tinya-code-gas-admin-ui-display-badge-fwk6sDU7.mjs.map +1 -0
  25. package/fesm2022/tinya-code-gas-admin-ui-display-date-D7zLiDiG.mjs +119 -0
  26. package/fesm2022/tinya-code-gas-admin-ui-display-date-D7zLiDiG.mjs.map +1 -0
  27. package/fesm2022/tinya-code-gas-admin-ui-display-file-BiIhqvQC.mjs +125 -0
  28. package/fesm2022/tinya-code-gas-admin-ui-display-file-BiIhqvQC.mjs.map +1 -0
  29. package/fesm2022/tinya-code-gas-admin-ui-display-image-C1dhnZi1.mjs +152 -0
  30. package/fesm2022/tinya-code-gas-admin-ui-display-image-C1dhnZi1.mjs.map +1 -0
  31. package/fesm2022/tinya-code-gas-admin-ui-display-list-DOEuUbGe.mjs +211 -0
  32. package/fesm2022/tinya-code-gas-admin-ui-display-list-DOEuUbGe.mjs.map +1 -0
  33. package/fesm2022/tinya-code-gas-admin-ui-display-number-DDMzr4Hn.mjs +116 -0
  34. package/fesm2022/tinya-code-gas-admin-ui-display-number-DDMzr4Hn.mjs.map +1 -0
  35. package/fesm2022/tinya-code-gas-admin-ui-display-text-B8CdVNpv.mjs +111 -0
  36. package/fesm2022/tinya-code-gas-admin-ui-display-text-B8CdVNpv.mjs.map +1 -0
  37. package/fesm2022/tinya-code-gas-admin-ui-dropdown-C3blvmE1.mjs +122 -0
  38. package/fesm2022/tinya-code-gas-admin-ui-dropdown-C3blvmE1.mjs.map +1 -0
  39. package/fesm2022/tinya-code-gas-admin-ui-email-CT_O5ihA.mjs +107 -0
  40. package/fesm2022/tinya-code-gas-admin-ui-email-CT_O5ihA.mjs.map +1 -0
  41. package/fesm2022/tinya-code-gas-admin-ui-empty-state-BMc0QtoT.mjs +109 -0
  42. package/fesm2022/tinya-code-gas-admin-ui-empty-state-BMc0QtoT.mjs.map +1 -0
  43. package/fesm2022/tinya-code-gas-admin-ui-error-mapper.service-DY5y1FjE.mjs +45 -0
  44. package/fesm2022/tinya-code-gas-admin-ui-error-mapper.service-DY5y1FjE.mjs.map +1 -0
  45. package/fesm2022/tinya-code-gas-admin-ui-field-aria-BD1Wiggc.mjs +50 -0
  46. package/fesm2022/tinya-code-gas-admin-ui-field-aria-BD1Wiggc.mjs.map +1 -0
  47. package/fesm2022/tinya-code-gas-admin-ui-field-node-CIK6KNN_.mjs +24 -0
  48. package/fesm2022/tinya-code-gas-admin-ui-field-node-CIK6KNN_.mjs.map +1 -0
  49. package/fesm2022/tinya-code-gas-admin-ui-field-path-B4-FTBGZ.mjs +27 -0
  50. package/fesm2022/tinya-code-gas-admin-ui-field-path-B4-FTBGZ.mjs.map +1 -0
  51. package/fesm2022/tinya-code-gas-admin-ui-file-Dmxioog7.mjs +408 -0
  52. package/fesm2022/tinya-code-gas-admin-ui-file-Dmxioog7.mjs.map +1 -0
  53. package/fesm2022/tinya-code-gas-admin-ui-form-view-CEe7aZ4m.mjs +4516 -0
  54. package/fesm2022/tinya-code-gas-admin-ui-form-view-CEe7aZ4m.mjs.map +1 -0
  55. package/fesm2022/tinya-code-gas-admin-ui-format-badge-CK8ct5Wk.mjs +82 -0
  56. package/fesm2022/tinya-code-gas-admin-ui-format-badge-CK8ct5Wk.mjs.map +1 -0
  57. package/fesm2022/tinya-code-gas-admin-ui-format-boolean-ClzezZz-.mjs +105 -0
  58. package/fesm2022/tinya-code-gas-admin-ui-format-boolean-ClzezZz-.mjs.map +1 -0
  59. package/fesm2022/tinya-code-gas-admin-ui-format-currency-CVmniKml.mjs +65 -0
  60. package/fesm2022/tinya-code-gas-admin-ui-format-currency-CVmniKml.mjs.map +1 -0
  61. package/fesm2022/tinya-code-gas-admin-ui-format-date-Dr1YsDd_.mjs +65 -0
  62. package/fesm2022/tinya-code-gas-admin-ui-format-date-Dr1YsDd_.mjs.map +1 -0
  63. package/fesm2022/tinya-code-gas-admin-ui-format-number-CWCjpI4n.mjs +65 -0
  64. package/fesm2022/tinya-code-gas-admin-ui-format-number-CWCjpI4n.mjs.map +1 -0
  65. package/fesm2022/tinya-code-gas-admin-ui-format-text-DBOgJkH0.mjs +59 -0
  66. package/fesm2022/tinya-code-gas-admin-ui-format-text-DBOgJkH0.mjs.map +1 -0
  67. package/fesm2022/tinya-code-gas-admin-ui-format-thumbnail-PCRvxWKt.mjs +94 -0
  68. package/fesm2022/tinya-code-gas-admin-ui-format-thumbnail-PCRvxWKt.mjs.map +1 -0
  69. package/fesm2022/tinya-code-gas-admin-ui-gap-sorting-iTdy_DYG.mjs +72 -0
  70. package/fesm2022/tinya-code-gas-admin-ui-gap-sorting-iTdy_DYG.mjs.map +1 -0
  71. package/fesm2022/tinya-code-gas-admin-ui-group-h7-O8tt4.mjs +238 -0
  72. package/fesm2022/tinya-code-gas-admin-ui-group-h7-O8tt4.mjs.map +1 -0
  73. package/fesm2022/tinya-code-gas-admin-ui-image-7UhJ7nqI.mjs +416 -0
  74. package/fesm2022/tinya-code-gas-admin-ui-image-7UhJ7nqI.mjs.map +1 -0
  75. package/fesm2022/tinya-code-gas-admin-ui-kanban-view-Dl0Ol5Kb.mjs +439 -0
  76. package/fesm2022/tinya-code-gas-admin-ui-kanban-view-Dl0Ol5Kb.mjs.map +1 -0
  77. package/fesm2022/tinya-code-gas-admin-ui-key-value-nVdgg5at.mjs +513 -0
  78. package/fesm2022/tinya-code-gas-admin-ui-key-value-nVdgg5at.mjs.map +1 -0
  79. package/fesm2022/tinya-code-gas-admin-ui-list-DTtCYS4d.mjs +637 -0
  80. package/fesm2022/tinya-code-gas-admin-ui-list-DTtCYS4d.mjs.map +1 -0
  81. package/fesm2022/tinya-code-gas-admin-ui-metric-card-DnGMQL8l.mjs +127 -0
  82. package/fesm2022/tinya-code-gas-admin-ui-metric-card-DnGMQL8l.mjs.map +1 -0
  83. package/fesm2022/tinya-code-gas-admin-ui-multiselect-PB28e-jl.mjs +251 -0
  84. package/fesm2022/tinya-code-gas-admin-ui-multiselect-PB28e-jl.mjs.map +1 -0
  85. package/fesm2022/tinya-code-gas-admin-ui-notification.service-LjSULER6.mjs +66 -0
  86. package/fesm2022/tinya-code-gas-admin-ui-notification.service-LjSULER6.mjs.map +1 -0
  87. package/fesm2022/tinya-code-gas-admin-ui-number-JNr7glc8.mjs +114 -0
  88. package/fesm2022/tinya-code-gas-admin-ui-number-JNr7glc8.mjs.map +1 -0
  89. package/fesm2022/tinya-code-gas-admin-ui-phone-jR417hPf.mjs +116 -0
  90. package/fesm2022/tinya-code-gas-admin-ui-phone-jR417hPf.mjs.map +1 -0
  91. package/fesm2022/tinya-code-gas-admin-ui-quick-actions-DCQ6emmF.mjs +235 -0
  92. package/fesm2022/tinya-code-gas-admin-ui-quick-actions-DCQ6emmF.mjs.map +1 -0
  93. package/fesm2022/tinya-code-gas-admin-ui-radio-mode-DxvN07DY.mjs +8 -0
  94. package/fesm2022/tinya-code-gas-admin-ui-radio-mode-DxvN07DY.mjs.map +1 -0
  95. package/fesm2022/tinya-code-gas-admin-ui-readonly-text-BL7-4qie.mjs +124 -0
  96. package/fesm2022/tinya-code-gas-admin-ui-readonly-text-BL7-4qie.mjs.map +1 -0
  97. package/fesm2022/tinya-code-gas-admin-ui-record-list-BiZfnd_7.mjs +249 -0
  98. package/fesm2022/tinya-code-gas-admin-ui-record-list-BiZfnd_7.mjs.map +1 -0
  99. package/fesm2022/tinya-code-gas-admin-ui-relation-drawer.service-B0kT8EiW.mjs +39 -0
  100. package/fesm2022/tinya-code-gas-admin-ui-relation-drawer.service-B0kT8EiW.mjs.map +1 -0
  101. package/fesm2022/tinya-code-gas-admin-ui-relation-ykpJ3PYl.mjs +309 -0
  102. package/fesm2022/tinya-code-gas-admin-ui-relation-ykpJ3PYl.mjs.map +1 -0
  103. package/fesm2022/tinya-code-gas-admin-ui-render-registry-B88Pme-y.mjs +576 -0
  104. package/fesm2022/tinya-code-gas-admin-ui-render-registry-B88Pme-y.mjs.map +1 -0
  105. package/fesm2022/tinya-code-gas-admin-ui-rich-select-CIHaOrbU.mjs +161 -0
  106. package/fesm2022/tinya-code-gas-admin-ui-rich-select-CIHaOrbU.mjs.map +1 -0
  107. package/fesm2022/tinya-code-gas-admin-ui-rolldown-runtime-DpJrqANO.mjs +11 -0
  108. package/fesm2022/tinya-code-gas-admin-ui-schema-catalog-D0Pk0wAN.mjs +685 -0
  109. package/fesm2022/tinya-code-gas-admin-ui-schema-catalog-D0Pk0wAN.mjs.map +1 -0
  110. package/fesm2022/tinya-code-gas-admin-ui-seed-DkVZbxPP.mjs +80 -0
  111. package/fesm2022/tinya-code-gas-admin-ui-seed-DkVZbxPP.mjs.map +1 -0
  112. package/fesm2022/tinya-code-gas-admin-ui-select-CDwX9yNO.mjs +296 -0
  113. package/fesm2022/tinya-code-gas-admin-ui-select-CDwX9yNO.mjs.map +1 -0
  114. package/fesm2022/tinya-code-gas-admin-ui-skeleton-DnWK0tcZ.mjs +119 -0
  115. package/fesm2022/tinya-code-gas-admin-ui-skeleton-DnWK0tcZ.mjs.map +1 -0
  116. package/fesm2022/tinya-code-gas-admin-ui-slug-DU58cbiY.mjs +158 -0
  117. package/fesm2022/tinya-code-gas-admin-ui-slug-DU58cbiY.mjs.map +1 -0
  118. package/fesm2022/tinya-code-gas-admin-ui-source-options-B9R4mw8-.mjs +26 -0
  119. package/fesm2022/tinya-code-gas-admin-ui-source-options-B9R4mw8-.mjs.map +1 -0
  120. package/fesm2022/tinya-code-gas-admin-ui-status-progress-DmeG8htE.mjs +205 -0
  121. package/fesm2022/tinya-code-gas-admin-ui-status-progress-DmeG8htE.mjs.map +1 -0
  122. package/fesm2022/tinya-code-gas-admin-ui-string-list-gleasqzD.mjs +432 -0
  123. package/fesm2022/tinya-code-gas-admin-ui-string-list-gleasqzD.mjs.map +1 -0
  124. package/fesm2022/tinya-code-gas-admin-ui-template-interpolator-ewv7CkNX.mjs +36 -0
  125. package/fesm2022/tinya-code-gas-admin-ui-template-interpolator-ewv7CkNX.mjs.map +1 -0
  126. package/fesm2022/tinya-code-gas-admin-ui-text-CUPmL7W_.mjs +107 -0
  127. package/fesm2022/tinya-code-gas-admin-ui-text-CUPmL7W_.mjs.map +1 -0
  128. package/fesm2022/tinya-code-gas-admin-ui-textarea-CGLSIW13.mjs +223 -0
  129. package/fesm2022/tinya-code-gas-admin-ui-textarea-CGLSIW13.mjs.map +1 -0
  130. package/fesm2022/tinya-code-gas-admin-ui-time-BcHzsTWf.mjs +107 -0
  131. package/fesm2022/tinya-code-gas-admin-ui-time-BcHzsTWf.mjs.map +1 -0
  132. package/fesm2022/tinya-code-gas-admin-ui-upload.service-CZPEPCeN.mjs +60 -0
  133. package/fesm2022/tinya-code-gas-admin-ui-upload.service-CZPEPCeN.mjs.map +1 -0
  134. package/fesm2022/tinya-code-gas-admin-ui-url-GO4LZi__.mjs +141 -0
  135. package/fesm2022/tinya-code-gas-admin-ui-url-GO4LZi__.mjs.map +1 -0
  136. package/fesm2022/tinya-code-gas-admin-ui.mjs +4738 -0
  137. package/fesm2022/tinya-code-gas-admin-ui.mjs.map +1 -0
  138. package/package.json +15 -3
  139. package/types/tinya-code-gas-admin-ui.d.ts +3634 -0
  140. package/ng-package.json +0 -7
  141. package/src/lib/actions/action-registry.spec.ts +0 -52
  142. package/src/lib/actions/action-registry.ts +0 -126
  143. package/src/lib/actions/action-service.spec.ts +0 -215
  144. package/src/lib/actions/action-service.ts +0 -87
  145. package/src/lib/actions/descriptors.spec.ts +0 -155
  146. package/src/lib/actions/descriptors.ts +0 -154
  147. package/src/lib/columns/column-cell.ts +0 -33
  148. package/src/lib/columns/column-defaults.spec.ts +0 -99
  149. package/src/lib/columns/column-defaults.ts +0 -84
  150. package/src/lib/columns/column-format.spec.ts +0 -274
  151. package/src/lib/columns/descriptors.ts +0 -113
  152. package/src/lib/columns/format-badge.ts +0 -51
  153. package/src/lib/columns/format-boolean.ts +0 -58
  154. package/src/lib/columns/format-currency.ts +0 -30
  155. package/src/lib/columns/format-date.ts +0 -35
  156. package/src/lib/columns/format-number.ts +0 -32
  157. package/src/lib/columns/format-text.ts +0 -23
  158. package/src/lib/columns/format-thumbnail.ts +0 -63
  159. package/src/lib/core/adapters/firebase-auth.adapter.ts +0 -6
  160. package/src/lib/core/guards/auth.guard.spec.ts +0 -88
  161. package/src/lib/core/guards/auth.guard.ts +0 -48
  162. package/src/lib/core/guards/unsaved-changes.guard.ts +0 -16
  163. package/src/lib/core/interceptors/api-error.interceptor.spec.ts +0 -182
  164. package/src/lib/core/interceptors/api-error.interceptor.ts +0 -87
  165. package/src/lib/core/models/api.model.ts +0 -104
  166. package/src/lib/core/models/schema-descriptions.ts +0 -118
  167. package/src/lib/core/models/schema.model.ts +0 -1097
  168. package/src/lib/core/registry/composition-validator.spec.ts +0 -358
  169. package/src/lib/core/registry/composition-validator.ts +0 -270
  170. package/src/lib/core/registry/field-validators.spec.ts +0 -199
  171. package/src/lib/core/registry/field-validators.ts +0 -440
  172. package/src/lib/core/registry/render-host.spec.ts +0 -208
  173. package/src/lib/core/registry/render-host.ts +0 -646
  174. package/src/lib/core/registry/render-registry.spec.ts +0 -96
  175. package/src/lib/core/registry/render-registry.ts +0 -312
  176. package/src/lib/core/registry/schema-catalog.ts +0 -156
  177. package/src/lib/core/services/api.service.spec.ts +0 -1142
  178. package/src/lib/core/services/api.service.ts +0 -371
  179. package/src/lib/core/services/auth.service.spec.ts +0 -653
  180. package/src/lib/core/services/auth.service.ts +0 -503
  181. package/src/lib/core/services/config.service.spec.ts +0 -121
  182. package/src/lib/core/services/config.service.ts +0 -119
  183. package/src/lib/core/services/data-source.service.spec.ts +0 -179
  184. package/src/lib/core/services/data-source.service.ts +0 -142
  185. package/src/lib/core/services/error-mapper.service.spec.ts +0 -50
  186. package/src/lib/core/services/error-mapper.service.ts +0 -49
  187. package/src/lib/core/services/notification.service.ts +0 -73
  188. package/src/lib/core/services/relation-drawer.service.ts +0 -41
  189. package/src/lib/core/services/theme.service.spec.ts +0 -106
  190. package/src/lib/core/services/theme.service.ts +0 -86
  191. package/src/lib/core/services/transport.spec.ts +0 -198
  192. package/src/lib/core/services/transport.ts +0 -164
  193. package/src/lib/core/services/upload.service.ts +0 -81
  194. package/src/lib/core/testing/categories.schema.ts +0 -125
  195. package/src/lib/core/testing/orders.schema.ts +0 -372
  196. package/src/lib/core/testing/products.schema.ts +0 -258
  197. package/src/lib/core/testing/site.schema.ts +0 -195
  198. package/src/lib/core/testing/test-catalog.ts +0 -21
  199. package/src/lib/core/tokens.ts +0 -112
  200. package/src/lib/core/utils/clipboard.spec.ts +0 -55
  201. package/src/lib/core/utils/clipboard.ts +0 -90
  202. package/src/lib/core/utils/context-resolver.spec.ts +0 -95
  203. package/src/lib/core/utils/context-resolver.ts +0 -101
  204. package/src/lib/core/utils/response-unwrapper.spec.ts +0 -70
  205. package/src/lib/core/utils/response-unwrapper.ts +0 -103
  206. package/src/lib/core/utils/source-options.spec.ts +0 -96
  207. package/src/lib/core/utils/source-options.ts +0 -54
  208. package/src/lib/core/utils/template-interpolator.spec.ts +0 -59
  209. package/src/lib/core/utils/template-interpolator.ts +0 -56
  210. package/src/lib/core/view-navigation/view-navigation.service.spec.ts +0 -207
  211. package/src/lib/core/view-navigation/view-navigation.service.ts +0 -132
  212. package/src/lib/fields/boolean/boolean.descriptor.ts +0 -11
  213. package/src/lib/fields/boolean/boolean.ts +0 -40
  214. package/src/lib/fields/color/color.descriptor.ts +0 -12
  215. package/src/lib/fields/color/color.ts +0 -34
  216. package/src/lib/fields/currency/currency.descriptor.ts +0 -12
  217. package/src/lib/fields/currency/currency.ts +0 -67
  218. package/src/lib/fields/date/date.descriptor.ts +0 -12
  219. package/src/lib/fields/date/date.ts +0 -36
  220. package/src/lib/fields/descriptors.ts +0 -122
  221. package/src/lib/fields/display/display-badge.ts +0 -65
  222. package/src/lib/fields/display/display-date.ts +0 -39
  223. package/src/lib/fields/display/display-defaults.ts +0 -84
  224. package/src/lib/fields/display/display-file.ts +0 -41
  225. package/src/lib/fields/display/display-image.ts +0 -54
  226. package/src/lib/fields/display/display-list.ts +0 -107
  227. package/src/lib/fields/display/display-number.ts +0 -41
  228. package/src/lib/fields/display/display-text.ts +0 -42
  229. package/src/lib/fields/display/display.spec.ts +0 -242
  230. package/src/lib/fields/dropdown/dropdown.descriptor.ts +0 -12
  231. package/src/lib/fields/dropdown/dropdown.ts +0 -45
  232. package/src/lib/fields/email/email.descriptor.ts +0 -12
  233. package/src/lib/fields/email/email.ts +0 -28
  234. package/src/lib/fields/field-aria.ts +0 -60
  235. package/src/lib/fields/field-host/field-host.spec.ts +0 -118
  236. package/src/lib/fields/field-host/field-host.ts +0 -47
  237. package/src/lib/fields/field-node.ts +0 -88
  238. package/src/lib/fields/file/file.descriptor.ts +0 -14
  239. package/src/lib/fields/file/file.spec.ts +0 -134
  240. package/src/lib/fields/file/file.ts +0 -281
  241. package/src/lib/fields/group/group.descriptor.ts +0 -21
  242. package/src/lib/fields/group/group.ts +0 -110
  243. package/src/lib/fields/image/image.descriptor.ts +0 -12
  244. package/src/lib/fields/image/image.spec.ts +0 -117
  245. package/src/lib/fields/image/image.ts +0 -281
  246. package/src/lib/fields/key-value/key-value.descriptor.ts +0 -11
  247. package/src/lib/fields/key-value/key-value.ts +0 -283
  248. package/src/lib/fields/list/list.descriptor.ts +0 -21
  249. package/src/lib/fields/list/list.ts +0 -376
  250. package/src/lib/fields/multiselect/multiselect.descriptor.ts +0 -11
  251. package/src/lib/fields/multiselect/multiselect.spec.ts +0 -142
  252. package/src/lib/fields/multiselect/multiselect.ts +0 -152
  253. package/src/lib/fields/number/number.descriptor.ts +0 -12
  254. package/src/lib/fields/number/number.ts +0 -40
  255. package/src/lib/fields/phone/phone.descriptor.ts +0 -12
  256. package/src/lib/fields/phone/phone.ts +0 -46
  257. package/src/lib/fields/readonly-text/readonly-text.descriptor.ts +0 -12
  258. package/src/lib/fields/readonly-text/readonly-text.ts +0 -58
  259. package/src/lib/fields/relation/relation.descriptor.ts +0 -12
  260. package/src/lib/fields/relation/relation.spec.ts +0 -193
  261. package/src/lib/fields/relation/relation.ts +0 -224
  262. package/src/lib/fields/rich-select/rich-select.descriptor.ts +0 -12
  263. package/src/lib/fields/rich-select/rich-select.ts +0 -175
  264. package/src/lib/fields/select/radio-mode.ts +0 -25
  265. package/src/lib/fields/select/select.descriptor.ts +0 -12
  266. package/src/lib/fields/select/select.spec.ts +0 -162
  267. package/src/lib/fields/select/select.ts +0 -210
  268. package/src/lib/fields/slug/slug.descriptor.ts +0 -19
  269. package/src/lib/fields/slug/slug.ts +0 -67
  270. package/src/lib/fields/string-list/string-list.descriptor.ts +0 -11
  271. package/src/lib/fields/string-list/string-list.ts +0 -222
  272. package/src/lib/fields/text/text.descriptor.ts +0 -12
  273. package/src/lib/fields/text/text.ts +0 -35
  274. package/src/lib/fields/textarea/textarea.descriptor.ts +0 -12
  275. package/src/lib/fields/textarea/textarea.spec.ts +0 -117
  276. package/src/lib/fields/textarea/textarea.ts +0 -126
  277. package/src/lib/fields/time/time.descriptor.ts +0 -12
  278. package/src/lib/fields/time/time.ts +0 -28
  279. package/src/lib/fields/unknown-render/unknown-render.ts +0 -49
  280. package/src/lib/fields/url/url.descriptor.ts +0 -12
  281. package/src/lib/fields/url/url.ts +0 -53
  282. package/src/lib/gas-admin-ui.spec.ts +0 -21
  283. package/src/lib/gas-admin-ui.ts +0 -9
  284. package/src/lib/layouts/descriptors.ts +0 -9
  285. package/src/lib/pages/dashboard/dashboard.ts +0 -167
  286. package/src/lib/pages/detail-view/detail-view.spec.ts +0 -333
  287. package/src/lib/pages/detail-view/detail-view.ts +0 -570
  288. package/src/lib/pages/drawer-form/drawer-form.ts +0 -228
  289. package/src/lib/pages/form-view/form-model.ts +0 -88
  290. package/src/lib/pages/form-view/form-schema.ts +0 -255
  291. package/src/lib/pages/form-view/form-view.ts +0 -1622
  292. package/src/lib/pages/list-view/list-view.formats.spec.ts +0 -214
  293. package/src/lib/pages/list-view/list-view.ts +0 -882
  294. package/src/lib/pages/login/login.spec.ts +0 -109
  295. package/src/lib/pages/login/login.ts +0 -227
  296. package/src/lib/pages/resource-page/resource-page.ts +0 -234
  297. package/src/lib/shared/components/badge/badge.ts +0 -35
  298. package/src/lib/shared/components/button/button.ts +0 -65
  299. package/src/lib/shared/components/confirm-dialog/confirm-dialog.ts +0 -48
  300. package/src/lib/shared/components/copy-button/copy-button.ts +0 -56
  301. package/src/lib/shared/components/copy-share/copy-share.spec.ts +0 -122
  302. package/src/lib/shared/components/copy-share/copy-share.ts +0 -107
  303. package/src/lib/shared/components/drawer/drawer.spec.ts +0 -127
  304. package/src/lib/shared/components/drawer/drawer.ts +0 -172
  305. package/src/lib/shared/components/empty-state/empty-state.ts +0 -30
  306. package/src/lib/shared/components/modal/modal.spec.ts +0 -149
  307. package/src/lib/shared/components/modal/modal.ts +0 -145
  308. package/src/lib/shared/components/post-create-modal/post-create-modal.spec.ts +0 -165
  309. package/src/lib/shared/components/post-create-modal/post-create-modal.ts +0 -159
  310. package/src/lib/shared/components/skeleton/skeleton.ts +0 -31
  311. package/src/lib/shared/components/toast/toast.ts +0 -58
  312. package/src/lib/shared/utils/col-span.ts +0 -25
  313. package/src/lib/shared/utils/condition-evaluator.ts +0 -53
  314. package/src/lib/shared/utils/depends-on.ts +0 -48
  315. package/src/lib/shared/utils/dialog-focus.ts +0 -28
  316. package/src/lib/shared/utils/field-path.ts +0 -49
  317. package/src/lib/shared/utils/gap-sorting.ts +0 -144
  318. package/src/lib/shared/utils/seed.spec.ts +0 -64
  319. package/src/lib/shared/utils/seed.ts +0 -149
  320. package/src/lib/shared/utils/slugify.ts +0 -13
  321. package/src/lib/shared/utils/validators.ts +0 -41
  322. package/src/lib/shell/layout/layout.ts +0 -63
  323. package/src/lib/shell/shell.routes.spec.ts +0 -59
  324. package/src/lib/shell/shell.routes.ts +0 -122
  325. package/src/lib/shell/sidebar/sidebar.ts +0 -139
  326. package/src/lib/shell/theme-toggle/theme-toggle.ts +0 -74
  327. package/src/lib/views/calendar-view/calendar-model.ts +0 -426
  328. package/src/lib/views/calendar-view/calendar-view.spec.ts +0 -557
  329. package/src/lib/views/calendar-view/calendar-view.ts +0 -568
  330. package/src/lib/views/composer/composer-host.spec.ts +0 -301
  331. package/src/lib/views/composer/composer-host.ts +0 -248
  332. package/src/lib/views/composer/composer-imports.spec.ts +0 -54
  333. package/src/lib/views/composer/view-context.spec.ts +0 -117
  334. package/src/lib/views/composer/view-context.ts +0 -109
  335. package/src/lib/views/composer/view-slot.spec.ts +0 -130
  336. package/src/lib/views/composer/view-slot.ts +0 -178
  337. package/src/lib/views/descriptors.ts +0 -46
  338. package/src/lib/views/kanban-view/kanban-model.ts +0 -173
  339. package/src/lib/views/kanban-view/kanban-view.spec.ts +0 -540
  340. package/src/lib/views/kanban-view/kanban-view.ts +0 -327
  341. package/src/lib/widgets/bar-chart/bar-chart.descriptor.ts +0 -17
  342. package/src/lib/widgets/bar-chart/bar-chart.spec.ts +0 -66
  343. package/src/lib/widgets/bar-chart/bar-chart.ts +0 -76
  344. package/src/lib/widgets/chart-line/chart-line.descriptor.ts +0 -17
  345. package/src/lib/widgets/chart-line/chart-line.spec.ts +0 -113
  346. package/src/lib/widgets/chart-line/chart-line.ts +0 -219
  347. package/src/lib/widgets/descriptors.ts +0 -29
  348. package/src/lib/widgets/metric-card/metric-card.descriptor.ts +0 -41
  349. package/src/lib/widgets/metric-card/metric-card.spec.ts +0 -52
  350. package/src/lib/widgets/metric-card/metric-card.ts +0 -48
  351. package/src/lib/widgets/quick-actions/quick-actions.descriptor.ts +0 -13
  352. package/src/lib/widgets/quick-actions/quick-actions.spec.ts +0 -61
  353. package/src/lib/widgets/quick-actions/quick-actions.ts +0 -100
  354. package/src/lib/widgets/record-list/record-list.descriptor.ts +0 -16
  355. package/src/lib/widgets/record-list/record-list.spec.ts +0 -79
  356. package/src/lib/widgets/record-list/record-list.ts +0 -115
  357. package/src/lib/widgets/series.spec.ts +0 -42
  358. package/src/lib/widgets/series.ts +0 -56
  359. package/src/lib/widgets/status-progress/status-progress.descriptor.ts +0 -19
  360. package/src/lib/widgets/status-progress/status-progress.spec.ts +0 -63
  361. package/src/lib/widgets/status-progress/status-progress.ts +0 -104
  362. package/src/lib/widgets/widget-host/widget-host.spec.ts +0 -179
  363. package/src/lib/widgets/widget-host/widget-host.ts +0 -99
  364. package/src/public-api.ts +0 -104
  365. package/tinya-code-gas-admin-ui-0.2.0-alpha.15.tgz +0 -0
  366. package/tsconfig.lib.json +0 -13
  367. package/tsconfig.lib.prod.json +0 -11
  368. package/tsconfig.spec.json +0 -10
@@ -1,63 +0,0 @@
1
- import { Component, signal } from '@angular/core';
2
- import { RouterOutlet } from '@angular/router';
3
-
4
- import { Button } from '../../shared/components/button/button';
5
- import { Sidebar } from '../sidebar/sidebar';
6
-
7
- /**
8
- * Esqueleto de la app autenticada: sidebar + área principal con outlet.
9
- *
10
- * Responsive: en pantallas chicas la sidebar es **offcanvas** (detrás de un
11
- * botón hamburguesa + backdrop); desde `lg` vuelve a ser estática y siempre
12
- * visible (clases `lg:*` del propio aside ganan sobre el estado `open`).
13
- */
14
- @Component({
15
- selector: 'app-layout',
16
- imports: [RouterOutlet, Sidebar, Button],
17
- template: `
18
- <div class="flex min-h-screen bg-neutral/5">
19
- <button
20
- app-button
21
- type="button"
22
- variant="outline"
23
- size="icon"
24
- class="fixed top-[calc(env(safe-area-inset-top)+0.75rem)] left-3 z-40 shadow-md lg:hidden"
25
- [attr.aria-expanded]="sidebarOpen()"
26
- aria-controls="main-sidebar"
27
- aria-label="Abrir menú"
28
- (click)="sidebarOpen.set(true)"
29
- >
30
- <svg
31
- aria-hidden="true"
32
- class="size-5"
33
- fill="none"
34
- stroke="currentColor"
35
- stroke-width="2"
36
- viewBox="0 0 24 24"
37
- >
38
- <path stroke-linecap="round" d="M4 6h16M4 12h16M4 18h16" />
39
- </svg>
40
- </button>
41
- @if (sidebarOpen()) {
42
- <div
43
- class="fixed inset-0 z-30 bg-black/30 lg:hidden"
44
- aria-hidden="true"
45
- (click)="sidebarOpen.set(false)"
46
- ></div>
47
- }
48
- <app-sidebar id="main-sidebar" [(open)]="sidebarOpen" />
49
- <!-- pt reafirmado en sm: sin esto la variante sm:p-6 (va después en la
50
- cascada) pisa el pt-16 base y el contenido choca con la hamburguesa.
51
- base/sm dejan pasar el safe-area del notch; en lg no hay hamburguesa. -->
52
- <main
53
- class="min-w-0 flex-1 p-4 pt-[calc(4rem+env(safe-area-inset-top))] sm:p-6 sm:pt-[calc(4rem+env(safe-area-inset-top))] lg:p-8"
54
- >
55
- <router-outlet />
56
- </main>
57
- </div>
58
- `,
59
- })
60
- export class Layout {
61
- /** Estado del offcanvas en mobile; en `lg` la sidebar es estática (siempre visible). */
62
- readonly sidebarOpen = signal(false);
63
- }
@@ -1,59 +0,0 @@
1
- import type { Route, Routes } from '@angular/router';
2
- import { afterEach, describe, expect, it } from 'vitest';
3
-
4
- import type { ResourceSchema } from '../core/models/schema.model';
5
- import { allSchemas, getAuth, setSchemaCatalog } from '../core/registry/schema-catalog';
6
- import { shellRoutes } from './shell.routes';
7
-
8
- /**
9
- * R11 · orden de producción (regresión): `app.routes.ts` importa el barrel
10
- * del paquete ANTES de que `provideGasAdmin` siembre el catálogo (corre en
11
- * el cuerpo de `app.config`). Si `shellRoutes` construye sus hijos en la
12
- * evaluación del módulo, quedan `[]` para siempre y toda URL protegida
13
- * renderiza vacío — el paquete compilado es eager aunque los specs, con el
14
- * transform de Vite, no lo sean.
15
- */
16
- const schemaDemo: ResourceSchema = {
17
- id: 'demo',
18
- label: 'Demo',
19
- labelPlural: 'Demos',
20
- kind: 'collection',
21
- endpoint: {},
22
- keyField: 'id',
23
- titleField: 'name',
24
- listColumns: [],
25
- fields: [],
26
- uiViews: {
27
- list: { type: 'list' },
28
- det: { type: 'detail', path: ':key' },
29
- },
30
- };
31
-
32
- async function materializar(): Promise<Route[]> {
33
- const loader = shellRoutes[0]?.loadChildren;
34
- expect(typeof loader, 'shellRoutes debe construir sus hijos al navegarse').toBe('function');
35
- const hijos = await (loader as () => Promise<Routes> | Routes)();
36
- const layout = hijos.find((route) => route.path === '');
37
- return layout?.children ?? hijos;
38
- }
39
-
40
- describe('shellRoutes en orden de producción (import del barrel antes del seed)', () => {
41
- const previo = { schemas: allSchemas(), auth: getAuth() };
42
- afterEach(() => setSchemaCatalog(previo.schemas, previo.auth));
43
-
44
- it('materializa las rutas cuando se navega, no al importar el módulo', async () => {
45
- setSchemaCatalog([schemaDemo], undefined);
46
-
47
- const rutas = (await materializar()).map((route) => route.path);
48
- expect(rutas).toContain('demo');
49
- expect(rutas).toContain('demo/:key');
50
- });
51
-
52
- it('con el catálogo vacío no revienta: devuelve cero rutas y el seed posterior surte efecto', async () => {
53
- setSchemaCatalog([], undefined);
54
- expect(await materializar()).toEqual([]);
55
-
56
- setSchemaCatalog([schemaDemo], undefined);
57
- expect((await materializar()).map((route) => route.path)).toContain('demo');
58
- });
59
- });
@@ -1,122 +0,0 @@
1
- import type { Route, Routes } from '@angular/router';
2
- import { inject } from '@angular/core';
3
-
4
- import { validateComposition } from '../core/registry/composition-validator';
5
- import type { ResourceSchema } from '../core/models/schema.model';
6
- import { get } from '../core/registry/render-registry';
7
- import { roleGuard } from '../core/guards/auth.guard';
8
- import { unsavedChangesGuard } from '../core/guards/unsaved-changes.guard';
9
- import { ViewNavigationService } from '../core/view-navigation/view-navigation.service';
10
- import { allSchemas } from '../core/registry/schema-catalog';
11
- import { createViewContext } from '../views/composer/view-context';
12
- import { Layout } from './layout/layout';
13
-
14
- function pathRank(path: string): number[] {
15
- const segments = path.split('/');
16
- return [segments.length, segments.filter((segment) => !segment.startsWith(':')).length];
17
- }
18
-
19
- function compareRoutes(a: Route, b: Route): number {
20
- const aRank = pathRank(a.path ?? '');
21
- const bRank = pathRank(b.path ?? '');
22
- return bRank[0] - aRank[0] || bRank[1] - aRank[1];
23
- }
24
-
25
- /**
26
- * Rutas de los schemas recibidos (por defecto, la registry completa).
27
- * Cada schema se valida con `validateComposition` ANTES de generar rutas
28
- * (D3): una composición inválida revienta al arrancar, no en el render.
29
- */
30
- export function resourceRoutes(catalog: readonly ResourceSchema[] = allSchemas()): Route[] {
31
- return catalog
32
- .flatMap((schema) => {
33
- if (!schema.uiViews || Object.keys(schema.uiViews).length === 0) {
34
- throw new Error(`El recurso '${schema.id}' no declara uiViews`);
35
- }
36
- validateComposition(schema);
37
- return Object.entries(schema.uiViews).map(([name, view]) => {
38
- const descriptor = get('view', view.type);
39
- if (!descriptor) {
40
- throw new Error(
41
- `No existe descriptor kind:view type '${view.type}' para ${schema.id}.${name}`,
42
- );
43
- }
44
- const relativePath = view.path ?? '';
45
- if (
46
- relativePath.startsWith('/') ||
47
- relativePath.endsWith('/') ||
48
- (relativePath !== '' &&
49
- relativePath
50
- .split('/')
51
- .some((segment) => segment === '' || segment === '.' || segment === '..'))
52
- ) {
53
- throw new Error(`Ruta uiViews inválida en ${schema.id}.${name}: '${relativePath}'`);
54
- }
55
- const path = [schema.id, relativePath].filter(Boolean).join('/');
56
- const route: Route = {
57
- path,
58
- loadComponent: descriptor.load,
59
- canActivate: [roleGuard],
60
- data: {
61
- resourceId: schema.id,
62
- uiView: name,
63
- viewType: view.type,
64
- },
65
- /**
66
- * R9.9 · D1/D4 — el payload lleva SIEMPRE el `select` declarado
67
- * (cualquier mode) para que la hoja aplique la decision table; el
68
- * `emit` se liga aquí (contexto de inyección) a
69
- * `ViewNavigationService.dispatch`, que resuelve el target,
70
- * construye los segmentos y respeta guards + historial. Sólo un
71
- * binding `mode:'route'` lleva `emit`; `none`/`inline`/ausente ⇒
72
- * payload sin emisor.
73
- */
74
- resolve: {
75
- viewContext: () => {
76
- const base = {
77
- resourceId: schema.id,
78
- uiView: name,
79
- viewType: view.type,
80
- ...(view.select !== undefined ? { select: view.select } : {}),
81
- };
82
- const select = view.select;
83
- if (select?.mode !== 'route') return createViewContext(base);
84
- const nav = inject(ViewNavigationService);
85
- return createViewContext(base, (event) => {
86
- void nav.dispatch(select, event);
87
- });
88
- },
89
- },
90
- };
91
- if (view.type === 'form') route.canDeactivate = [unsavedChangesGuard];
92
- return route;
93
- });
94
- })
95
- .sort(compareRoutes);
96
- }
97
-
98
- /**
99
- * Las rutas del shell salen de `uiViews`, no de `ResourceSchema.views` (que
100
- * conserva los metadatos de consultas del backend). Añadir o cambiar una
101
- * página requiere una declaración y un descriptor `kind: 'view'`.
102
- *
103
- * Los hijos se construyen DENTRO del `loadChildren` (en la primera
104
- * navegación), nunca en la evaluación del módulo: el consumidor importa
105
- * este barrel desde `app.routes.ts` ANTES de que `provideGasAdmin` siembre
106
- * el catálogo (corre en el cuerpo de `app.config`), y el paquete compilado
107
- * es eager — construir en el import congelaría `children: []` para siempre
108
- * y toda URL protegida renderizaría vacío (regresión: shell.routes.spec en
109
- * orden de producción).
110
- */
111
- export const shellRoutes: Routes = [
112
- {
113
- path: '',
114
- loadChildren: () => [
115
- {
116
- path: '',
117
- component: Layout,
118
- children: resourceRoutes(),
119
- },
120
- ],
121
- },
122
- ];
@@ -1,139 +0,0 @@
1
- import { Component, computed, inject, model, signal } from '@angular/core';
2
- import { RouterLink, RouterLinkActive } from '@angular/router';
3
- import { LucideLogOut } from '@lucide/angular';
4
-
5
- import { allSchemas } from '../../core/registry/schema-catalog';
6
- import { AuthService } from '../../core/services/auth.service';
7
- import { NotificationService } from '../../core/services/notification.service';
8
- import { Button } from '../../shared/components/button/button';
9
- import { ThemeToggle } from '../theme-toggle/theme-toggle';
10
- import type { ResourceSchema } from '../../core/models/schema.model';
11
-
12
- interface MenuEntry {
13
- id: string;
14
- label: string;
15
- }
16
-
17
- /**
18
- * Menú lateral generado desde el catálogo EFECTIVO (F7-4): locales
19
- * fusionados + recursos sintetizados del schema remoto — un recurso nuevo
20
- * del backend aparece acá con 0 cambios en `src/`. Reactivo a la señal del
21
- * schema remoto (el initializer lo resuelve antes del primer render, pero
22
- * el `computed` cubre el caso de respuesta tardía).
23
- * `labelPlural` + `permissions`: un recurso se oculta solo si declara
24
- * create, update y remove explícitamente en falso (no hay permiso de
25
- * lectura).
26
- */
27
- @Component({
28
- selector: 'app-sidebar',
29
- imports: [RouterLink, RouterLinkActive, ThemeToggle, Button, LucideLogOut],
30
- template: `
31
- <!-- Offcanvas en mobile (transform); las clases lg: la dejan estática
32
- y siempre visible en pantallas grandes. -->
33
- <aside
34
- class="fixed inset-y-0 left-0 z-40 w-60 shrink-0 h-[100svh] min-h-[80svh] lg:sticky border-r border-neutral/20 bg-surface-raised transition-transform duration-200 lg:static lg:z-auto lg:translate-x-0"
35
- [class.-translate-x-full]="!open()"
36
- >
37
- <div class="flex items-center justify-between gap-2 border-b border-neutral/20 px-4 py-4">
38
- <!-- min-w-0+truncate: si el toggle exige su ancho, el rótulo se
39
- trunca en vez de desbordar la sidebar de 240 px. -->
40
- <span class="min-w-0 truncate font-display text-base font-semibold">Admin</span>
41
- <app-theme-toggle />
42
- </div>
43
- <nav aria-label="Principal" class="p-3">
44
- <ul class="space-y-2 lg:space-y-1">
45
- @for (item of menuItems(); track item.id) {
46
- <li>
47
- <a
48
- [routerLink]="['/', item.id]"
49
- routerLinkActive="bg-primary/10 text-primary"
50
- class="flex min-h-11 items-center rounded-lg px-3 py-2 text-sm font-medium text-neutral hover:bg-neutral/10"
51
- (click)="open.set(false)"
52
- >
53
- {{ item.label }}
54
- </a>
55
- </li>
56
- }
57
- </ul>
58
- </nav>
59
- @if (isAuthenticated()) {
60
- <div class="border-t border-neutral/20 p-3">
61
- <button
62
- app-button
63
- type="button"
64
- variant="danger"
65
- [loading]="loggingOut()"
66
- [disabled]="loggingOut()"
67
- (click)="closeSession()"
68
- class="w-full"
69
- >
70
- <svg lucideLogOut size="16" />
71
- Cerrar sesión
72
- </button>
73
- </div>
74
- }
75
- </aside>
76
- `,
77
- })
78
- export class Sidebar {
79
- /** Estado del offcanvas (sólo relevante en mobile; ver `layout.ts`).
80
- * `model()`: el padre lo setea (abrir) y el hijo también (cerrar al
81
- * navegar) — binding de dos vías `[(open)]`. */
82
- readonly open = model(false);
83
-
84
- private readonly auth = inject(AuthService);
85
- private readonly notifications = inject(NotificationService);
86
- readonly isAuthenticated = this.auth.isAuthenticated;
87
- readonly loggingOut = signal(false);
88
-
89
- /**
90
- * R2.10 — el menú se corta dos veces: `isVisible` (permisos declarados
91
- * en el schema) y `canAccess` (auth.md §5.3, `access` de la sesión).
92
- * Sólo UX: filtrar acá no protege nada, el back re-verifica en R2.6.
93
- */
94
- readonly menuItems = computed<MenuEntry[]>(() =>
95
- allSchemas()
96
- .filter((schema) => isVisible(schema) && this.auth.canAccess(schema.access))
97
- .map((schema) => ({
98
- id: schema.id,
99
- label: schema.labelPlural,
100
- })),
101
- );
102
-
103
- async closeSession(): Promise<void> {
104
- const accepted = await this.notifications.confirm({
105
- title: 'Cerrar sesión',
106
- message: '¿Seguro que querés cerrar tu sesión?',
107
- confirmLabel: 'Cerrar sesión',
108
- });
109
- if (!accepted) return;
110
-
111
- this.loggingOut.set(true);
112
- this.auth.logout().subscribe({
113
- complete: () => this.loggingOut.set(false),
114
- });
115
- }
116
- }
117
-
118
- function isVisible(schema: ResourceSchema): boolean {
119
- // R7.5: usar policies cuando existan, fallback a permissions
120
- if (schema.policies?.access) {
121
- // Con policies, asumimos que si el usuario tiene sesión puede ver el recurso
122
- // (el filtrado real lo hace `canAccess` en el computed, que evalúa el rol).
123
- // Esta función sólo puede aplicar criterios estáticos, no dinámicos.
124
- return true;
125
- }
126
-
127
- // Fallback a permissions (legacy)
128
- const permissions = schema.permissions;
129
- if (!permissions) {
130
- return true;
131
- }
132
- // Un recurso de sólo lectura (todas las escrituras en false) sigue siendo
133
- // visible si tiene endpoint de lectura (list/get): no se oculta por ser
134
- // read-only. Sólo se oculta si no puede leer NI escribir.
135
- const hasReadEndpoint = !!schema.endpoint?.list || !!schema.endpoint?.get;
136
- const canWrite =
137
- permissions.create !== false || permissions.update !== false || permissions.remove !== false;
138
- return hasReadEndpoint || canWrite;
139
- }
@@ -1,74 +0,0 @@
1
- import { Component, inject } from '@angular/core';
2
- import { LucideMonitor, LucideMoon, LucideSun } from '@lucide/angular';
3
-
4
- import { ThemeService, type ThemeMode } from '../../core/services/theme.service';
5
-
6
- const BASE =
7
- 'rounded-md p-1.5 transition-colors ' +
8
- // 44×44 en mobile (guía ux-ui-mobile §8.2); en lg vuelve a 28 px (ratón).
9
- 'min-h-11 min-w-11 lg:min-h-0 lg:min-w-0 ' +
10
- 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary';
11
- const ACTIVE = 'bg-primary/10 text-primary';
12
- const IDLE = 'text-neutral hover:bg-neutral/10';
13
-
14
- /**
15
- * Selector de tema de tres posiciones: Sistema / Claro / Oscuro (§8.6).
16
- *
17
- * Van tres `<button>` con `aria-pressed` y no un `role="radiogroup"`: un
18
- * radiogroup exige navegación con flechas para cumplir su contrato, mientras
19
- * que tres botones ya son operables con Tab + Enter/Space y el lector de
20
- * pantalla anuncia "presionado / no presionado" en cada uno. Es la opción
21
- * con menos JS y sin degradar el teclado.
22
- *
23
- * Sólo icono, con `aria-label` y `title` para no ocupar ancho en la cabecera
24
- * de la sidebar (240 px).
25
- */
26
- @Component({
27
- selector: 'app-theme-toggle',
28
- imports: [LucideMonitor, LucideSun, LucideMoon],
29
- template: `
30
- <div
31
- role="group"
32
- aria-label="Tema del panel"
33
- class="inline-flex items-center gap-0.5 rounded-lg border border-neutral/20 bg-surface p-0.5"
34
- >
35
- <button
36
- type="button"
37
- [class]="classes('system')"
38
- [attr.aria-pressed]="theme.mode() === 'system'"
39
- aria-label="Tema: seguir al sistema"
40
- title="Seguir al sistema"
41
- (click)="theme.set('system')"
42
- >
43
- <svg lucideMonitor size="16" />
44
- </button>
45
- <button
46
- type="button"
47
- [class]="classes('light')"
48
- [attr.aria-pressed]="theme.mode() === 'light'"
49
- aria-label="Tema: claro"
50
- title="Tema claro"
51
- (click)="theme.set('light')"
52
- >
53
- <svg lucideSun size="16" />
54
- </button>
55
- <button
56
- type="button"
57
- [class]="classes('dark')"
58
- [attr.aria-pressed]="theme.mode() === 'dark'"
59
- aria-label="Tema: oscuro"
60
- title="Tema oscuro"
61
- (click)="theme.set('dark')"
62
- >
63
- <svg lucideMoon size="16" />
64
- </button>
65
- </div>
66
- `,
67
- })
68
- export class ThemeToggle {
69
- readonly theme = inject(ThemeService);
70
-
71
- classes(mode: ThemeMode): string {
72
- return `${BASE} ${this.theme.mode() === mode ? ACTIVE : IDLE}`;
73
- }
74
- }