@nxgt/material 2.7.0 → 2.8.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 (210) hide show
  1. package/CHANGELOG.md +180 -0
  2. package/README.md +7 -4
  3. package/dist/{_Uint8Array-JRUmWcRr.js → _Uint8Array-CALbCR7W.js} +1 -1
  4. package/dist/{_overRest-DvC5rm5s.js → _overRest-BQ8agsDH.js} +1 -1
  5. package/dist/{abnfDiagram-O67JEVCF-Cl4ukf6a.js → abnfDiagram-O67JEVCF-D-rmT4BY.js} +4 -4
  6. package/dist/{architectureDiagram-NJMV4G6O-WmFlBQF5.js → architectureDiagram-NJMV4G6O-DOc_c_T9.js} +7 -7
  7. package/dist/{async-slice-OftEOtMA.js → async-slice-BHMdvnqm.js} +2 -2
  8. package/dist/{blockDiagram-BEXU5L5S-BM-gkWAO.js → blockDiagram-BEXU5L5S-D4gI6nqs.js} +11 -11
  9. package/dist/{c4Diagram-YGBWAQC7-D9xSt2QO.js → c4Diagram-YGBWAQC7-El4SkIzX.js} +8 -8
  10. package/dist/{channel-Dg92Hoym.js → channel-CnLB6790.js} +1 -1
  11. package/dist/{chunk-3FUC2YCW-Cf18L00V.js → chunk-3FUC2YCW-BLMCnCFE.js} +8 -8
  12. package/dist/{chunk-5DYCD2WN-Cja1INgd.js → chunk-5DYCD2WN-Cd1zazNp.js} +3 -3
  13. package/dist/{chunk-6AEJRKK7-3YWRP4aV.js → chunk-6AEJRKK7-BLBlw8ui.js} +2 -2
  14. package/dist/{chunk-742MDFTN-Cs1qGiTK.js → chunk-742MDFTN-CsUjFyzK.js} +2 -2
  15. package/dist/{chunk-7INBJB4K-BY5n77ka.js → chunk-7INBJB4K-k-I67NSP.js} +6 -6
  16. package/dist/{chunk-7M6MHVWA-C3x6E3yT.js → chunk-7M6MHVWA-CUtKEeuL.js} +9 -9
  17. package/dist/{chunk-7PRAP22T-_Av9vcXz.js → chunk-7PRAP22T-0C6_H8Li.js} +1 -1
  18. package/dist/{chunk-GNY47TPC-D1E6DHDV.js → chunk-GNY47TPC-CB_83G7J.js} +11 -11
  19. package/dist/{chunk-GTNCS2PH-BZ9WMD1v.js → chunk-GTNCS2PH-AJi9PVT7.js} +3 -3
  20. package/dist/{chunk-GWA4HPMP-Co-A6dtV.js → chunk-GWA4HPMP-B8jXI0Tl.js} +3 -3
  21. package/dist/{chunk-MBY4JIJT-C3RQP_Nk.js → chunk-MBY4JIJT-BFIqOe-8.js} +4 -4
  22. package/dist/{chunk-NETBCI7D-DJUuN4EY.js → chunk-NETBCI7D-Cywmx0rz.js} +1 -1
  23. package/dist/{chunk-O7XYJQB3-A66QSOPA.js → chunk-O7XYJQB3-BChweQ_V.js} +1 -1
  24. package/dist/{chunk-UA2S7LBM-BNeHeMx9.js → chunk-UA2S7LBM-ChuksCDg.js} +6 -6
  25. package/dist/{chunk-WEXAMYUT-CucJfehv.js → chunk-WEXAMYUT-CbFOhEve.js} +2 -2
  26. package/dist/{chunk-XXDRQBXY-FgXU14Bh.js → chunk-XXDRQBXY-dKXxu_aj.js} +1 -1
  27. package/dist/{chunk-Z7XXMR3K-DMTBxZxM.js → chunk-Z7XXMR3K-Ccb3Rfjl.js} +8 -8
  28. package/dist/{chunk-ZIGJFQKS-C3xUAXJq.js → chunk-ZIGJFQKS-9VXArDKF.js} +3 -3
  29. package/dist/{classDiagram-v2-NBCMYWYE-BDaxYvDy.js → classDiagram-v2-NBCMYWYE-CRgxPgLD.js} +14 -14
  30. package/dist/clsx-CbxlCXZ3.js +16 -0
  31. package/dist/components/base-content.css +139 -0
  32. package/dist/components/base.css +150 -0
  33. package/dist/components/components.css +2 -0
  34. package/dist/components/reduced-motion.css +56 -0
  35. package/dist/components/theme-tokens.css +116 -0
  36. package/dist/components/ui/actions/button-group/button-group.css +1 -1
  37. package/dist/components/ui/feedback/toast/toast.css +21 -0
  38. package/dist/components/ui/primitives/label/label.css +33 -0
  39. package/dist/{components-DrStgM4J.js → components-Bg1bqGbc.js} +34666 -34274
  40. package/dist/components.js +6 -6
  41. package/dist/{cose-bilkent-JH36ORCC-DRUT3qBb.js → cose-bilkent-JH36ORCC-P94vkHv_.js} +2 -2
  42. package/dist/{cynefinDiagram-VND7K2PF-B9HrdQW8.js → cynefinDiagram-VND7K2PF-EIpXbLXm.js} +4 -4
  43. package/dist/{dagre-6A5THRUB-DZF0nICj.js → dagre-6A5THRUB-c8yG3_vh.js} +20 -20
  44. package/dist/{diagram-22UHCM2B-CVZYpeev.js → diagram-22UHCM2B-C3Xcfy6D.js} +15 -15
  45. package/dist/{diagram-3UASUU5V-D7MmBJbM.js → diagram-3UASUU5V-maEO61Bh.js} +7 -7
  46. package/dist/{diagram-ATOU4E4O-CNY-8kl0.js → diagram-ATOU4E4O-isL7nwg2.js} +3 -3
  47. package/dist/{diagram-CDSNMT55-C8Mk1smi.js → diagram-CDSNMT55-Bnhlo5at.js} +5 -5
  48. package/dist/{diagram-MLGK6HIB-CpfeILwW.js → diagram-MLGK6HIB-DvBcyz8v.js} +4 -4
  49. package/dist/{diagram-MPIPVDR6-Do7bUnTd.js → diagram-MPIPVDR6-iTevwmNE.js} +4 -4
  50. package/dist/{dist-C3YK_ean.js → dist-B6_-RPZ3.js} +1 -1
  51. package/dist/{dist-CRbPtqwD.js → dist-BvUQHUs_.js} +4 -4
  52. package/dist/dnd.js +1 -1
  53. package/dist/{ebnfDiagram-ZINNZB2B-1GewX9Zq.js → ebnfDiagram-ZINNZB2B-RVuQIpm0.js} +4 -4
  54. package/dist/{elk-276RUBZZ-DI4eicFj.js → elk-276RUBZZ-BoWoJr6K.js} +26 -26
  55. package/dist/{erDiagram-OPXOYQCR-CUbpVns3.js → erDiagram-OPXOYQCR-CVvgZCSJ.js} +14 -14
  56. package/dist/field-blur-Bwa48QBk.js +3637 -0
  57. package/dist/flowDiagram-KWPJA3E3-RdU0csul.js +17 -0
  58. package/dist/{ganttDiagram-FUAMR5RP-D3vmspam.js → ganttDiagram-FUAMR5RP-DPLDPJtJ.js} +6 -6
  59. package/dist/{gitGraphDiagram-X574FWY7-80yOq8dE.js → gitGraphDiagram-X574FWY7-DerJL1Q-.js} +3 -3
  60. package/dist/{graphlib-DLJn7qS3.js → graphlib-DHgEBs83.js} +6 -6
  61. package/dist/hooks.js +3 -3
  62. package/dist/{i18n-provider-DBFRz5uH.js → i18n-provider-CA8YAlje.js} +1 -1
  63. package/dist/i18n.js +6 -6
  64. package/dist/icon-button-G9zdQ3Ix.js +2753 -0
  65. package/dist/{infoDiagram-VRGFBTTK-Cboh-B9n.js → infoDiagram-VRGFBTTK-CtVsLyCQ.js} +3 -3
  66. package/dist/{isArrayLikeObject-CO5xeuaJ.js → isArrayLikeObject-BSfDsA7T.js} +3 -3
  67. package/dist/{isEmpty-DOC38Ces.js → isEmpty-BEe-nNXw.js} +3 -3
  68. package/dist/{ishikawaDiagram-OU5B5YK6-DwTd1YxL.js → ishikawaDiagram-OU5B5YK6-D1n8vp8C.js} +4 -4
  69. package/dist/{journeyDiagram-ZHPQQLJL-Dxvl3oeN.js → journeyDiagram-ZHPQQLJL-CTGnr-JY.js} +4 -4
  70. package/dist/{kanban-definition-PNTS6WVX-S8plI4wn.js → kanban-definition-PNTS6WVX-D1-Owjil.js} +10 -10
  71. package/dist/lib/components/ui/actions/button/busy-click-capture.d.ts +11 -0
  72. package/dist/lib/components/ui/actions/button/button-tones.d.ts +36 -0
  73. package/dist/lib/components/ui/actions/button/button.d.ts +19 -0
  74. package/dist/lib/components/ui/actions/button/button.wrap.d.ts +8 -0
  75. package/dist/lib/components/ui/actions/button/label-text.d.ts +10 -0
  76. package/dist/lib/components/ui/actions/button/use-click-lock.d.ts +18 -0
  77. package/dist/lib/components/ui/actions/copy-button/copy-button.d.ts +5 -1
  78. package/dist/lib/components/ui/actions/icon-button/icon-button.compound-variants.d.ts +114 -0
  79. package/dist/lib/components/ui/collections/data-table/hooks.d.ts +13 -13
  80. package/dist/lib/components/ui/collections/data-table/partials/data-table-empty-row.d.ts +5 -1
  81. package/dist/lib/components/ui/collections/data-table/partials/data-table-scroll-region.d.ts +16 -0
  82. package/dist/lib/components/ui/collections/data-table/partials/data-table-toolbar.d.ts +24 -0
  83. package/dist/lib/components/ui/collections/data-table/select-checkbox.d.ts +10 -0
  84. package/dist/lib/components/ui/collections/data-table/types.d.ts +9 -0
  85. package/dist/lib/components/ui/collections/data-table/use-data-table.d.ts +12 -1
  86. package/dist/lib/components/ui/collections/data-table/use-scroll-edges.d.ts +22 -0
  87. package/dist/lib/components/ui/dates/calendar/calendar-day.d.ts +8 -0
  88. package/dist/lib/components/ui/dates/calendar/calendar.d.ts +3 -3
  89. package/dist/lib/components/ui/dates/calendar/calendar.utils.d.ts +8 -0
  90. package/dist/lib/components/ui/dates/calendar/use-calendar-labels.d.ts +22 -0
  91. package/dist/lib/components/ui/display/description/description.d.ts +2 -1
  92. package/dist/lib/components/ui/display/list-tile/list-tile.d.ts +9 -1
  93. package/dist/lib/components/ui/display/list-tile/partials/list-tile-body.d.ts +11 -0
  94. package/dist/lib/components/ui/display/list-tile/partials/list-tile-classes.d.ts +10 -0
  95. package/dist/lib/components/ui/feedback/alert-dialog/alert-dialog.d.ts +1 -1
  96. package/dist/lib/components/ui/feedback/toast/partials/toast-actions.d.ts +3 -0
  97. package/dist/lib/components/ui/feedback/toast/toast.d.ts +27 -3
  98. package/dist/lib/components/ui/feedback/toast/toaster.d.ts +19 -0
  99. package/dist/lib/components/ui/feedback/toast/toasts.d.ts +3 -0
  100. package/dist/lib/components/ui/forms/field-blur.d.ts +7 -2
  101. package/dist/lib/components/ui/forms/use-field-blur.d.ts +8 -1
  102. package/dist/lib/components/ui/layout/app-shell/activity-content.d.ts +10 -1
  103. package/dist/lib/components/ui/layout/app-shell/activity-layout.d.ts +26 -2
  104. package/dist/lib/components/ui/layout/app-shell/app-header.d.ts +8 -2
  105. package/dist/lib/components/ui/layout/app-shell/app-sidebar.d.ts +8 -2
  106. package/dist/lib/components/ui/layout/app-shell/types.d.ts +3 -0
  107. package/dist/lib/components/ui/layout/app-shell/use-content-scroll.d.ts +10 -0
  108. package/dist/lib/components/ui/layout/app-shell/use-navigation-sheet.d.ts +19 -0
  109. package/dist/lib/components/ui/layout/sidebar/index.d.ts +5 -0
  110. package/dist/lib/components/ui/layout/sidebar/sidebar-content.d.ts +2 -0
  111. package/dist/lib/components/ui/layout/sidebar/sidebar-context.d.ts +7 -0
  112. package/dist/lib/components/ui/layout/sidebar/sidebar-footer.d.ts +2 -0
  113. package/dist/lib/components/ui/layout/sidebar/sidebar-header.d.ts +2 -0
  114. package/dist/lib/components/ui/layout/sidebar/sidebar-menu-item-tooltip.d.ts +7 -0
  115. package/dist/lib/components/ui/layout/sidebar/sidebar-menu-item.d.ts +31 -0
  116. package/dist/lib/components/ui/layout/sidebar/sidebar-menu-label.d.ts +4 -0
  117. package/dist/lib/components/ui/layout/sidebar/sidebar.d.ts +1 -12
  118. package/dist/lib/components/ui/overlays/context-menu/context-menu-items.d.ts +10 -0
  119. package/dist/lib/components/ui/overlays/context-menu/context-menu-sub.d.ts +8 -0
  120. package/dist/lib/components/ui/overlays/context-menu/context-menu.d.ts +4 -14
  121. package/dist/lib/components/ui/overlays/dialog/dialog-outside.d.ts +6 -0
  122. package/dist/lib/components/ui/overlays/dialog/dialog-scroll-content.d.ts +1 -1
  123. package/dist/lib/components/ui/overlays/dialog/dialog.d.ts +1 -1
  124. package/dist/lib/components/ui/overlays/dialog/use-return-focus.d.ts +3 -2
  125. package/dist/lib/components/ui/overlays/drawer/drawer.d.ts +1 -1
  126. package/dist/lib/components/ui/overlays/dropdown-menu/dropdown-menu-items.d.ts +11 -0
  127. package/dist/lib/components/ui/overlays/dropdown-menu/dropdown-menu-sub.d.ts +8 -0
  128. package/dist/lib/components/ui/overlays/dropdown-menu/dropdown-menu.d.ts +6 -21
  129. package/dist/lib/components/ui/overlays/popover/popover.d.ts +1 -1
  130. package/dist/lib/components/ui/overlays/sheet/sheet.d.ts +1 -1
  131. package/dist/lib/components/ui/primitives/card/card.d.ts +10 -1
  132. package/dist/lib/components/ui/primitives/link/link-component.d.ts +14 -0
  133. package/dist/lib/components/ui/selection/select/select.d.ts +1 -1
  134. package/dist/lib/components/ui/selection/select-chip-field/select-chip-field.d.ts +1 -1
  135. package/dist/lib/i18n/resources/en/en.d.ts +9 -0
  136. package/dist/lib/i18n/resources/en/material.json.d.ts +13 -4
  137. package/dist/lib/i18n/resources/fr/fr.d.ts +9 -0
  138. package/dist/lib/i18n/resources/fr/material.json.d.ts +13 -4
  139. package/dist/lib/i18n/resources/resources.d.ts +18 -0
  140. package/dist/lib/i18n/translator.d.ts +1 -1
  141. package/dist/lib/lib/redux/status-slice.d.ts +1 -1
  142. package/dist/lib.js +39 -55
  143. package/dist/main.js +13 -13
  144. package/dist/map.js +35 -35
  145. package/dist/material.css +1 -1
  146. package/dist/{merge-CuDTNgpm.js → merge-CRXQ4NSv.js} +4 -4
  147. package/dist/{mermaid.core-O7mtb1-p.js → mermaid.core-C_JPRVNa.js} +49 -49
  148. package/dist/{mindmap-definition-NLK3R4M7-CO0E97EZ.js → mindmap-definition-NLK3R4M7-OTZIWZah.js} +13 -13
  149. package/dist/{pegDiagram-GJSIUBJH-CAO6aYvj.js → pegDiagram-GJSIUBJH-CWKobqLl.js} +4 -4
  150. package/dist/{pieDiagram-5QR66LMP-BXxVfv5K.js → pieDiagram-5QR66LMP-BpmwlCYh.js} +5 -5
  151. package/dist/print.js +2 -2
  152. package/dist/{quadrantDiagram-O4NWA36T-BbidZDM8.js → quadrantDiagram-O4NWA36T-CIFt4MgA.js} +3 -3
  153. package/dist/{railroadDiagram-XR7U4H2S-DmKDXg8V.js → railroadDiagram-XR7U4H2S-fsZ7oqPG.js} +4 -4
  154. package/dist/{requirementDiagram-PLB6GJNP-wFvgSWJP.js → requirementDiagram-PLB6GJNP-BJaiDsKj.js} +13 -13
  155. package/dist/rolldown-runtime-BFFgcFxR.js +30 -0
  156. package/dist/{sankeyDiagram-IPEJSGJF-Cka5t09q.js → sankeyDiagram-IPEJSGJF-XDAIB5as.js} +3 -3
  157. package/dist/{sequenceDiagram-PO4LG4MO-B2qb55A5.js → sequenceDiagram-PO4LG4MO-Bgx1kuGA.js} +5 -5
  158. package/dist/{sortable-provider-C5VYhY8u.js → sortable-provider-MCgOzfRp.js} +24 -24
  159. package/dist/{src-C9kQSo6K.js → src-CsLQInsN.js} +1 -1
  160. package/dist/{stateDiagram-v2-GCMORJYK-EMa7q3ju.js → stateDiagram-v2-GCMORJYK-CGo16q99.js} +14 -14
  161. package/dist/{stored-language-B0o4cBh8.js → stored-language-Cz89IYZX.js} +26 -8
  162. package/dist/styles.css +10 -368
  163. package/dist/{swimlanes-2SLR337P-BtZ7Di5u.js → swimlanes-2SLR337P-DXZt0zyd.js} +12 -12
  164. package/dist/swimlanesDiagram-TC7HE7FX-Cno6MSMH.js +28 -0
  165. package/dist/{timeline-definition-EJHVYXUP-2Z6UABw8.js → timeline-definition-EJHVYXUP-CbPIZcT7.js} +5 -5
  166. package/dist/{translate-material-BCwQrt2G.js → translate-material-Caxsy0bp.js} +2 -2
  167. package/dist/{translator-CwpmpI24.js → translator-B85Q_O55.js} +1 -1
  168. package/dist/{use-heading-spy-BtBJiU63.js → use-heading-spy-C4yWEr5c.js} +37 -37
  169. package/dist/{use-material-translation-DG_7z3Q7.js → use-material-translation-Cm3Ej3bT.js} +2 -2
  170. package/dist/{usecaseDiagram-POWQR4AR-DT56cp_B.js → usecaseDiagram-POWQR4AR-D_gyFA3m.js} +13 -13
  171. package/dist/{utils-UBn-46YY.js → utils-DC8bw9A_.js} +346 -360
  172. package/dist/{vennDiagram-UO4OBE2U-CO0yFCI8.js → vennDiagram-UO4OBE2U-BpgP__1T.js} +4 -4
  173. package/dist/{wardleyDiagram-VNRHLVJA-QkwghAYo.js → wardleyDiagram-VNRHLVJA-CYqKMb2f.js} +4 -4
  174. package/dist/{xychartDiagram-PMCCYNJV-B2aZlrno.js → xychartDiagram-PMCCYNJV-W-fXV6iN.js} +7 -7
  175. package/docs/components/buttons-and-actions.md +60 -10
  176. package/docs/components/data-display.md +23 -1
  177. package/docs/components/data-table-filter-and-lists.md +88 -10
  178. package/docs/components/date-and-time.md +24 -0
  179. package/docs/components/feedback-and-status.md +85 -8
  180. package/docs/components/form-fields.md +14 -5
  181. package/docs/components/media-and-files.md +7 -0
  182. package/docs/components/navigation-and-layout.md +21 -3
  183. package/docs/components/overlays-and-menus.md +21 -6
  184. package/docs/components/primitives.md +16 -2
  185. package/docs/components/selection-and-choice.md +13 -2
  186. package/docs/getting-started.md +4 -2
  187. package/docs/guides/app-shell.md +97 -4
  188. package/docs/guides/forms.md +54 -5
  189. package/docs/guides/helpers.md +2 -2
  190. package/docs/guides/i18n.md +5 -2
  191. package/docs/guides/ssr.md +1 -1
  192. package/docs/guides/theming.md +133 -5
  193. package/docs/previews/data-display-description.webp +0 -0
  194. package/docs/previews/feedback-status-toast.webp +0 -0
  195. package/docs/roadmap.md +22 -1
  196. package/docs/troubleshooting.md +963 -11
  197. package/lib/components/base-content.css +139 -0
  198. package/lib/components/base.css +150 -0
  199. package/lib/components/components.css +2 -0
  200. package/lib/components/reduced-motion.css +56 -0
  201. package/lib/components/theme-tokens.css +116 -0
  202. package/lib/components/ui/actions/button-group/button-group.css +1 -1
  203. package/lib/components/ui/feedback/toast/toast.css +21 -0
  204. package/lib/components/ui/primitives/label/label.css +33 -0
  205. package/lib/styles.css +10 -368
  206. package/package.json +2 -2
  207. package/dist/field-blur-DWQtxiAe.js +0 -3483
  208. package/dist/flowDiagram-KWPJA3E3-DZxumFfu.js +0 -17
  209. package/dist/icon-button-BxySFfrr.js +0 -2718
  210. package/dist/swimlanesDiagram-TC7HE7FX-CROh8GTF.js +0 -28
@@ -0,0 +1,139 @@
1
+ /* The base layer's second half, imported by lib/styles.css after
2
+ * base.css: the rich text editor's content (`.tiptap`) and the form grid
3
+ * (`.form-grid-layout`). */
4
+ @layer base {
5
+ body {
6
+ .tiptap {
7
+ ul li p,
8
+ ol li p {
9
+ display: inline;
10
+ }
11
+
12
+ ul:not([data-type="taskList"]) {
13
+ list-style-type: disc;
14
+ }
15
+ ol {
16
+ list-style-type: decimal;
17
+ }
18
+
19
+ ul:not([data-type="taskList"]),
20
+ ol {
21
+ @apply list-inside marker:text-muted-foreground;
22
+ }
23
+
24
+ ul[data-type="taskList"] li {
25
+ @apply flex gap-2 items-center;
26
+ }
27
+
28
+ :first-child {
29
+ margin-top: 0;
30
+ }
31
+
32
+ table {
33
+ /* Override the global `body table { width: w-full }` base rule
34
+ (see @layer base above) — it fights TipTap's resizable colgroup
35
+ widths, which only get applied as an inline table width once
36
+ every column has an explicit pixel width. Letting the table size
37
+ itself (still table-layout: fixed) makes resizing and
38
+ center/right alignment actually visible. */
39
+ width: auto;
40
+
41
+ .selectedCell {
42
+ @apply bg-primary/20;
43
+ }
44
+
45
+ .column-resize-handle {
46
+ background-color: var(--color-primary);
47
+ bottom: -2px;
48
+ pointer-events: none;
49
+ position: absolute;
50
+ right: -2px;
51
+ top: 0;
52
+ width: 4px;
53
+ }
54
+
55
+ &[data-table-caption]::before {
56
+ content: attr(data-table-caption);
57
+ display: block;
58
+ margin-bottom: 0.5rem;
59
+ @apply text-sm text-muted-foreground text-center;
60
+ }
61
+ }
62
+
63
+ .tableWrapper {
64
+ margin: 1.5rem 0;
65
+ overflow-x: auto;
66
+
67
+ &:has(table[data-table-align="center"]) {
68
+ width: fit-content;
69
+ margin-inline: auto;
70
+ }
71
+
72
+ &:has(table[data-table-align="right"]) {
73
+ width: fit-content;
74
+ margin-left: auto;
75
+ margin-right: 0;
76
+ }
77
+ }
78
+
79
+ &.resize-cursor {
80
+ cursor: col-resize;
81
+ }
82
+
83
+ .is-empty::before {
84
+ content: attr(data-placeholder);
85
+ float: left;
86
+ height: 0;
87
+ pointer-events: none;
88
+ @apply text-muted-foreground;
89
+ }
90
+
91
+ .has-focus {
92
+ @apply bg-accent/40 rounded;
93
+ }
94
+ }
95
+ }
96
+
97
+ .form-grid-layout {
98
+ @apply relative flex flex-col gap-2 @container;
99
+ [data-slot="form-fields"] {
100
+ @apply grid @2xl:grid-cols-2 @4xl:grid-cols-3 @6xl:grid-cols-4 gap-2 bg-background/80 p-4 place-items-start overflow-auto;
101
+
102
+ [data-slot="separator"] {
103
+ @apply col-start-full;
104
+ }
105
+
106
+ [data-slot*="text-field"],
107
+ [data-slot*="autocomplete-field"][data-mode="single"],
108
+ [data-slot*="currency-form-field"],
109
+ [data-slot*="time-field"],
110
+ [data-slot*="image-field"],
111
+ [data-slot*="select-field"] {
112
+ @apply w-full;
113
+ }
114
+
115
+ [data-slot="switch-field"],
116
+ [data-slot="textarea-field"],
117
+ [data-slot="autocomplete-field"][data-mode="multiple"],
118
+ [data-slot="select-chip-field"],
119
+ [data-slot="file-picker-field"] {
120
+ @apply col-start-full @6xl:col-span-2;
121
+ }
122
+
123
+ [data-slot="files-form-field"],
124
+ [data-slot="rich-text-editor"] {
125
+ @apply col-start-full;
126
+ }
127
+ }
128
+ [data-slot="form-actions"] {
129
+ @apply flex w-full justify-end gap-2 bottom-2 p-4 max-sm:*:flex-1;
130
+ }
131
+ }
132
+
133
+ .form-grid-layout {
134
+ @apply max-h-[calc(100lvh-184px)] md:max-h-[calc(100lvh-242px)] lg:max-h-[calc(100lvh-280px)];
135
+ }
136
+
137
+ /* No height cap on `DataTable` here (it nested a scroll in the page's):
138
+ its `maxHeight` prop opts in. */
139
+ }
@@ -0,0 +1,150 @@
1
+ /* The base layer lib/styles.css imports: what every element gets before the
2
+ * utilities (border colour, outline, selection, scrollbars, body and prose
3
+ * elements). */
4
+ @layer base {
5
+ * {
6
+ @apply border-border outline-ring/50 selection:bg-primary selection:text-primary-foreground;
7
+ &::-webkit-scrollbar {
8
+ @apply w-1 gap-4 h-1 md:w-1.5 md:h-1.5 cursor-pointer;
9
+ }
10
+ &::-webkit-scrollbar-track {
11
+ @apply rounded bg-primary/20;
12
+ }
13
+ &::-webkit-scrollbar-thumb {
14
+ @apply rounded bg-muted-foreground;
15
+ }
16
+
17
+ input::-webkit-outer-spin-button,
18
+ ::-webkit-inner-spin-button {
19
+ -webkit-appearance: none;
20
+ margin: 0;
21
+ }
22
+ }
23
+ body {
24
+ @apply bg-background text-foreground;
25
+
26
+ input[type="number"] {
27
+ -moz-appearance: textfield;
28
+ }
29
+
30
+ [data-slot="icon"] {
31
+ @apply dark:fill-foreground;
32
+ }
33
+
34
+ h1 {
35
+ font-size: var(--text-2xl);
36
+ font-weight: var(--font-weight-medium);
37
+ }
38
+ h2 {
39
+ font-size: var(--text-xl);
40
+ font-weight: var(--font-weight-medium);
41
+ }
42
+ h3 {
43
+ font-size: var(--text-lg);
44
+ font-weight: var(--font-weight-medium);
45
+ }
46
+ h4 {
47
+ font-size: var(--text-base);
48
+ font-weight: var(--font-weight-medium);
49
+ }
50
+ h5 {
51
+ font-size: var(--text-sm);
52
+ font-weight: var(--font-weight-medium);
53
+ }
54
+ h6 {
55
+ font-size: var(--text-xs);
56
+ font-weight: var(--font-weight-medium);
57
+ }
58
+ a:not(:has(> button)) {
59
+ @apply focus:underline underline-offset-4 hover:underline cursor-pointer;
60
+ @apply text-info [&_svg]:data-[slot=icon]:text-info hover:bg-info/10 active:bg-info/5 focus:bg-info/15;
61
+ }
62
+
63
+ code {
64
+ @apply rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono mx-0.5;
65
+ }
66
+
67
+ blockquote {
68
+ @apply border-l-2 border-primary/40 pl-4 italic text-muted-foreground my-1;
69
+ }
70
+ pre {
71
+ @apply bg-muted rounded p-4 overflow-x-auto my-1;
72
+ code {
73
+ @apply text-sm;
74
+ }
75
+ }
76
+
77
+ ul li p,
78
+ ol li p {
79
+ display: inline;
80
+ }
81
+
82
+ ul[data-type="taskList"] {
83
+ list-style-type: disc;
84
+ }
85
+ ol[data-type="taskList"] {
86
+ list-style-type: decimal;
87
+ }
88
+
89
+ ul[data-type="taskList"] li {
90
+ @apply flex gap-2 items-center;
91
+ }
92
+
93
+ ul,
94
+ ol {
95
+ @apply list-inside marker:text-muted-foreground;
96
+ }
97
+
98
+ [data-type="emoji"] {
99
+ img {
100
+ @apply size-4;
101
+ }
102
+ }
103
+
104
+ input[type="checkbox"] {
105
+ display: grid;
106
+ place-content: center;
107
+ -webkit-appearance: none;
108
+ appearance: none;
109
+ font: inherit;
110
+ color: ---value(--color-primary);
111
+ width: 1.05em;
112
+ height: 1.05em;
113
+ border: 0.13em solid var(--muted-foreground);
114
+ border-radius: 0.15em;
115
+ }
116
+ input[type="checkbox"]::before {
117
+ content: "";
118
+ width: 0.55em;
119
+ height: 0.55em;
120
+ transform: scale(0);
121
+ transition: 120ms transform ease-in-out;
122
+ box-shadow: inset 1em 1em var(--color-primary);
123
+ }
124
+ input[type="checkbox"]:checked::before {
125
+ transform: scale(1);
126
+ }
127
+ input[type="checkbox"]:indeterminate::before {
128
+ height: 0.15em;
129
+ }
130
+
131
+ table {
132
+ overflow: hidden;
133
+ table-layout: fixed;
134
+ @apply border-collapse w-full overflow-hidden rounded;
135
+
136
+ tr {
137
+ @apply even:bg-primary/5;
138
+ }
139
+
140
+ td,
141
+ th {
142
+ @apply border-0 p-1 py-2;
143
+ }
144
+
145
+ th {
146
+ @apply bg-primary/15 text-left text-muted-foreground dark:text-primary-foreground;
147
+ }
148
+ }
149
+ }
150
+ }
@@ -16,6 +16,8 @@
16
16
  @import "./ui/display/code/code-moonlight.css";
17
17
  @import "./ui/actions/button-group/button-group.css";
18
18
  @import "./ui/layout/app-bar/bottom-app-bar.css";
19
+ @import "./ui/primitives/label/label.css";
20
+ @import "./ui/feedback/toast/toast.css";
19
21
  @import "./ui/fields/contacts/contact-item.css";
20
22
  @import "./ui/fields/opening-hours/opening-hours-item.css";
21
23
  @import "./ui/fields/attributes/attribute-form/attribute-form.css";
@@ -0,0 +1,56 @@
1
+ /* prefers-reduced-motion: the catalogue's components (their `data-slot`
2
+ * elements and what they render, toasts included) stop animating and
3
+ * transitioning: an animation ends at once, a transition jumps. The spinner
4
+ * and any `animate-spin` element keep turning, as they are the only sign that
5
+ * something is loading (WCAG 2.3.3 allows essential motion).
6
+ *
7
+ * Deliberately outside any `@layer`: an `!important` declaration in a layer
8
+ * beats an unlayered or utility `!important` one (the order of layers reverses
9
+ * for `!important`), so a layered rule could not be overridden by the app.
10
+ * Unlayered, and wrapped in `:where()` so its specificity is 0, it still beats
11
+ * a component's `duration-500` utility (those are not `!important`), while an
12
+ * app's own `!important` rule on a class wins. */
13
+ @media (prefers-reduced-motion: reduce) {
14
+ :where(
15
+ [data-slot],
16
+ [data-slot] *,
17
+ [data-sonner-toaster] *,
18
+ [data-sonner-toast]
19
+ ):where(
20
+ :not(
21
+ [data-slot="spinner"],
22
+ [data-slot="spinner"] *,
23
+ .animate-spin,
24
+ .animate-spin *
25
+ )
26
+ ),
27
+ :where([data-slot], [data-slot] *, [data-sonner-toaster] *):where(
28
+ :not(
29
+ [data-slot="spinner"],
30
+ [data-slot="spinner"] *,
31
+ .animate-spin,
32
+ .animate-spin *
33
+ )
34
+ )::before,
35
+ :where([data-slot], [data-slot] *, [data-sonner-toaster] *):where(
36
+ :not(
37
+ [data-slot="spinner"],
38
+ [data-slot="spinner"] *,
39
+ .animate-spin,
40
+ .animate-spin *
41
+ )
42
+ )::after {
43
+ /* biome-ignore lint/complexity/noImportantStyles: it must beat a component's utility */
44
+ animation-duration: 0.01ms !important;
45
+ /* biome-ignore lint/complexity/noImportantStyles: it must beat a component's utility */
46
+ animation-delay: 0s !important;
47
+ /* biome-ignore lint/complexity/noImportantStyles: it must beat a component's utility */
48
+ animation-iteration-count: 1 !important;
49
+ /* biome-ignore lint/complexity/noImportantStyles: it must beat a component's utility */
50
+ transition-duration: 0.01ms !important;
51
+ /* biome-ignore lint/complexity/noImportantStyles: it must beat a component's utility */
52
+ transition-delay: 0s !important;
53
+ /* biome-ignore lint/complexity/noImportantStyles: it must beat a component's utility */
54
+ scroll-behavior: auto !important;
55
+ }
56
+ }
@@ -0,0 +1,116 @@
1
+ /* The theme's colour tokens: light under :root, dark under .dark and
2
+ * [data-theme="dark"]. Imported by lib/styles.css; an app overrides a token
3
+ * after importing the stylesheet, under the same selectors. */
4
+ :root {
5
+ --radius: 0.625rem;
6
+ --background: oklch(1 0 0);
7
+ --foreground: oklch(0.14 0.036 258.53);
8
+ --card: oklch(1 0 0);
9
+ --card-foreground: oklch(0.129 0.042 264.695);
10
+ --strix: oklch(45.91% 0.1864 310.75);
11
+ --popover: oklch(1 0 0);
12
+ --popover-foreground: oklch(0.129 0.042 264.695);
13
+ --primary: oklch(46% 0.1135 276.35);
14
+ --primary-foreground: oklch(0.984 0.003 247.858);
15
+ --secondary: oklch(50% 0.1135 245.65);
16
+ --secondary-foreground: oklch(0.984 0.003 247.858);
17
+ --muted: oklch(0.968 0.007 247.896);
18
+ --muted-foreground: oklch(0.52 0.046 257.417);
19
+ /* Non-text (WCAG 1.4.11): the empty part of a slider, a meter, a drawer
20
+ handle. Light keeps the pale track; the value reads from the thumb. */
21
+ --track: oklch(0.968 0.007 247.896);
22
+ --track-fill: var(--primary);
23
+ --tooltip: oklch(0.446 0.043 257.281);
24
+ --tooltip-foreground: oklch(1 0 0);
25
+ --accent: oklch(0.9182 0.0077 228.86);
26
+ --accent-foreground: oklch(0.216 0.006 56.043);
27
+ /* Darker than the dark theme's: near-white text on a filled error surface
28
+ reaches 4.8:1 (4.6 at 0.577), and the colour as text 5.0:1 on white. */
29
+ --error: oklch(0.56 0.245 27.325);
30
+ --error-foreground: oklch(0.984 0.003 247.858);
31
+ /* Error drawn as text (a field's message, HelperText, a focused error menu
32
+ item): 5.7:1 on white and 4.8:1 on the menu's bg-error/10 tint, where
33
+ --error itself gives 5.0 and 4.2:1. */
34
+ --error-text: color-mix(in oklab, var(--error) 94%, black);
35
+ /* The foregrounds are near-white: these three are dark enough for WCAG AA
36
+ text (4.5:1) on them, and for the same colours used as text on white. */
37
+ --success: oklch(0.48 0.118 184.704);
38
+ --success-foreground: oklch(0.984 0.003 247.858);
39
+ --info: oklch(0.5 0.165 254.624);
40
+ --info-foreground: oklch(0.984 0.003 247.858);
41
+ --warning: oklch(0.54 0.222 41.116);
42
+ --warning-foreground: oklch(0.984 0.003 247.858);
43
+ --destructive: var(--error);
44
+ --border: oklch(0.929 0.013 255.508);
45
+ --input: oklch(0.929 0.013 255.508);
46
+ --ring: oklch(0.704 0.04 256.788);
47
+ --chart-1: oklch(0.646 0.222 41.116);
48
+ --chart-2: oklch(0.6 0.118 184.704);
49
+ --chart-3: oklch(0.398 0.07 227.392);
50
+ --chart-4: oklch(0.828 0.189 84.429);
51
+ --chart-5: oklch(0.769 0.188 70.08);
52
+ --sidebar: oklch(0.984 0.003 247.858);
53
+ --sidebar-foreground: oklch(0.129 0.042 264.695);
54
+ --sidebar-primary: oklch(0.208 0.042 265.755);
55
+ --sidebar-primary-foreground: oklch(0.984 0.003 247.858);
56
+ --sidebar-accent: oklch(0.968 0.007 247.896);
57
+ --sidebar-accent-foreground: oklch(0.208 0.042 265.755);
58
+ --sidebar-border: oklch(0.929 0.013 255.508);
59
+ --sidebar-ring: oklch(0.704 0.04 256.788);
60
+ }
61
+
62
+ .dark,
63
+ [data-theme="dark"] {
64
+ --background: oklch(0.14 0.036 258.53);
65
+ --foreground: oklch(0.984 0.003 247.858);
66
+ --card: oklch(0.208 0.042 265.755);
67
+ --card-foreground: oklch(0.984 0.003 247.858);
68
+ --popover: oklch(0.208 0.042 265.755);
69
+ --popover-foreground: oklch(0.984 0.003 247.858);
70
+ --primary: oklch(46% 0.1135 276.35);
71
+ --primary-foreground: oklch(0.984 0.003 247.858);
72
+ /* Brighter than the light one: it is read as text on the dark surfaces (6.5:1
73
+ on --background, 5.8:1 on --card); a filled secondary surface tints it
74
+ (dark:bg-secondary/70) to keep 5.2:1 under its near-white text. */
75
+ --secondary: oklch(0.66 0.1135 245.65);
76
+ --secondary-foreground: oklch(0.984 0.003 247.858);
77
+ --muted: oklch(0.279 0.041 260.031);
78
+ --muted-foreground: oklch(0.66 0.046 257.417);
79
+ /* 3.6:1 on --background, 3.2:1 on --card; the fill 3.4:1 on the track. */
80
+ --track: oklch(0.52 0.03 257.417);
81
+ --track-fill: oklch(0.85 0.09 276.35);
82
+ --tooltip: oklch(0.929 0.013 255.508);
83
+ --tooltip-foreground: oklch(0.446 0.043 257.281);
84
+ --accent: oklch(0.268 0.007 34.298);
85
+ --accent-foreground: oklch(0.985 0.001 106.423);
86
+ --error: oklch(0.577 0.245 27.325);
87
+ --error-foreground: oklch(0.984 0.003 247.858);
88
+ /* --error stays the fill under near-white text; as text it would give only
89
+ 4.2:1 on --background and 3.8:1 on --card. Lightened, 5.9 and 5.3:1. */
90
+ --error-text: color-mix(in oklab, var(--error) 80%, white);
91
+ /* The light brights: on the dark surfaces they read as text and as the
92
+ badge's 60% tint, which keeps its contrast (7.3, 5.7 and 7.5:1). */
93
+ --success: oklch(0.6 0.118 184.704);
94
+ --success-foreground: oklch(0.984 0.003 247.858);
95
+ --info: oklch(0.707 0.165 254.624);
96
+ --info-foreground: oklch(0.984 0.003 247.858);
97
+ --warning: oklch(0.646 0.222 41.116);
98
+ --warning-foreground: oklch(0.984 0.003 247.858);
99
+ --destructive: oklch(0.704 0.191 22.216);
100
+ --border: oklch(1 0 0 / 10%);
101
+ --input: oklch(1 0 0 / 15%);
102
+ --ring: oklch(0.551 0.027 264.364);
103
+ --chart-1: oklch(0.488 0.243 264.376);
104
+ --chart-2: oklch(0.696 0.17 162.48);
105
+ --chart-3: oklch(0.769 0.188 70.08);
106
+ --chart-4: oklch(0.627 0.265 303.9);
107
+ --chart-5: oklch(0.645 0.246 16.439);
108
+ --sidebar: oklch(0.208 0.042 265.755);
109
+ --sidebar-foreground: oklch(0.984 0.003 247.858);
110
+ --sidebar-primary: oklch(0.488 0.243 264.376);
111
+ --sidebar-primary-foreground: oklch(0.984 0.003 247.858);
112
+ --sidebar-accent: oklch(0.279 0.041 260.031);
113
+ --sidebar-accent-foreground: oklch(0.984 0.003 247.858);
114
+ --sidebar-border: oklch(1 0 0 / 10%);
115
+ --sidebar-ring: oklch(0.551 0.027 264.364);
116
+ }
@@ -6,7 +6,7 @@
6
6
  @apply stroke-foreground/80 size-5;
7
7
  }
8
8
  &[data-state="active"] {
9
- @apply bg-primary text-primary-foreground hover:bg-primary/90 [&_svg]:stroke-primary-foreground;
9
+ @apply bg-primary text-primary-foreground hover:bg-[color-mix(in_oklab,var(--color-primary)_90%,black)] [&_svg]:stroke-primary-foreground;
10
10
  }
11
11
  }
12
12
  }
@@ -0,0 +1,21 @@
1
+ /* sonner (vue-sonner) fades a toast's wrapper in from opacity 0, and a text
2
+ * that is half transparent fails WCAG 1.4.3 for as long as the fade lasts
3
+ * (axe reports it). Our toasts are custom ones (`data-styled="false"`): keep
4
+ * the wrapper opaque while mounting, so the toast only slides and scales in.
5
+ * A toast that is hidden (behind the limit) or leaving still fades. */
6
+ [data-sonner-toast][data-styled="false"]:not(
7
+ [data-visible="false"],
8
+ [data-removed="true"]
9
+ ) {
10
+ opacity: 1;
11
+ }
12
+
13
+ /* A modal dialog sets `pointer-events: none` on `<body>` (Radix and reka's
14
+ * `disableOutsidePointerEvents`): the toaster inherits it from `<body>` while
15
+ * a modal is open (sonner itself sets none), so a toast's action over a
16
+ * dialog could not be clicked nor tapped. A hidden toast
17
+ * (`[data-visible="false"]`) keeps sonner's own `pointer-events: none`, set
18
+ * on the toast itself, which wins over this inherited value. */
19
+ [data-sonner-toaster] {
20
+ pointer-events: auto;
21
+ }
@@ -0,0 +1,33 @@
1
+ /* The required mark of `Label withAsterisk`. Drawn, not typed: a "*" in the
2
+ * label's text joined its name ("Email *") for `getByLabel(…, { exact })`,
3
+ * `getByLabelText` and screen readers, and generated text (`content: "*"`)
4
+ * joins the accessible name too. An empty `content` painted by a mask adds
5
+ * nothing to the name or the text. The field's own `required` /
6
+ * `aria-required` is what is announced. Restyle it from your own CSS:
7
+ * `background-color` for the colour, `width` / `height` for the size. */
8
+ [data-slot="label-text"][data-required]::after {
9
+ content: "";
10
+ display: inline-block;
11
+ flex: none;
12
+ align-self: flex-start;
13
+ width: 0.5em;
14
+ height: 0.5em;
15
+ margin-block-start: 0.05em;
16
+ background-color: var(--color-error);
17
+ --label-required-mark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cpath d='M5 1v8M1.5 3l7 4M8.5 3l-7 4' stroke='black' stroke-width='1.75' stroke-linecap='round' fill='none'/%3E%3C/svg%3E");
18
+ mask-image: var(--label-required-mark);
19
+ mask-size: contain;
20
+ mask-repeat: no-repeat;
21
+ mask-position: center;
22
+ /* A browser's print stylesheet drops backgrounds; this one is the mark. */
23
+ print-color-adjust: exact;
24
+ -webkit-print-color-adjust: exact;
25
+ }
26
+
27
+ /* Forced colours replace background-color with the system palette's own;
28
+ * CanvasText keeps the mark visible on any theme. */
29
+ @media (forced-colors: active) {
30
+ [data-slot="label-text"][data-required]::after {
31
+ background-color: CanvasText;
32
+ }
33
+ }