@tantainnovative/ndpr-toolkit 3.3.0 → 3.4.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 (176) hide show
  1. package/CHANGELOG.md +529 -0
  2. package/README.md +4 -4
  3. package/dist/{ConsentBanner-CDRT0o2k.d.mts → ConsentBanner-F5ayys5K.d.mts} +10 -0
  4. package/dist/{ConsentBanner-Vxyt8SCX.d.ts → ConsentBanner-VqIPophc.d.ts} +10 -0
  5. package/dist/{styling-B7CBzYG7.d.ts → ConsentManager-C7I3PDe8.d.mts} +2 -62
  6. package/dist/{styling-uJLsBbER.d.mts → ConsentManager-CQ2IZtUU.d.ts} +2 -62
  7. package/dist/{sanitize-B0AzEm1D.d.mts → NDPRProvider-DYFb8xEl.d.ts} +2 -94
  8. package/dist/{sanitize-B0AzEm1D.d.ts → NDPRProvider-U3QNu6MA.d.mts} +2 -94
  9. package/dist/adapters.js +1 -1
  10. package/dist/adapters.mjs +1 -1
  11. package/dist/breach.js +1 -1
  12. package/dist/breach.mjs +1 -1
  13. package/dist/chunk-2AW7KAZO.mjs +2 -0
  14. package/dist/chunk-2WH4DLV5.js +3 -0
  15. package/dist/chunk-3NQQSU4P.js +2 -0
  16. package/dist/chunk-3VQAYQR7.js +7 -0
  17. package/dist/chunk-4R42ZNO7.mjs +318 -0
  18. package/dist/chunk-5HL4UBFV.js +2 -0
  19. package/dist/chunk-6FGCGLH5.mjs +2 -0
  20. package/dist/chunk-6HZL2WDU.mjs +2 -0
  21. package/dist/chunk-6QPRDQZF.js +2 -0
  22. package/dist/chunk-74Z23WUA.mjs +2 -0
  23. package/dist/chunk-AHSMDPG5.js +132 -0
  24. package/dist/chunk-BN77GP4W.mjs +2 -0
  25. package/dist/chunk-C5QO3SX4.js +2 -0
  26. package/dist/chunk-CISJAQ6W.mjs +2 -0
  27. package/dist/chunk-DCJK5OZT.mjs +2 -0
  28. package/dist/chunk-DUY6F3GT.mjs +94 -0
  29. package/dist/chunk-EHAZIKDX.js +81 -0
  30. package/dist/chunk-EPT2K355.mjs +2 -0
  31. package/dist/chunk-HGGLW5TE.js +2 -0
  32. package/dist/chunk-HQSU7LGM.js +94 -0
  33. package/dist/chunk-IZCWCE7W.mjs +2 -0
  34. package/dist/chunk-JBSCER34.js +2 -0
  35. package/dist/chunk-KF3EFJEF.mjs +3 -0
  36. package/dist/chunk-KSERBMXW.mjs +4 -0
  37. package/dist/chunk-LJNNPAFU.mjs +2 -0
  38. package/dist/{chunk-UXMGBIX6.js → chunk-LSCMXAPY.mjs} +4 -4
  39. package/dist/chunk-LSNL4XR5.js +2 -0
  40. package/dist/chunk-M2TPT5GB.js +2 -0
  41. package/dist/chunk-MCWV7S2G.js +2 -0
  42. package/dist/chunk-MG73MOZC.mjs +15 -0
  43. package/dist/chunk-NCOZB2WU.mjs +2 -0
  44. package/dist/chunk-NQNFS3QI.js +7 -0
  45. package/dist/chunk-OPYQIJKY.js +2 -0
  46. package/dist/{chunk-ZEOQYWOE.mjs → chunk-P2YV6DR3.js} +4 -4
  47. package/dist/chunk-P6QAFBCV.js +2 -0
  48. package/dist/chunk-QVULSG6J.mjs +3 -0
  49. package/dist/chunk-R5FW5XUQ.mjs +2 -0
  50. package/dist/chunk-RGNP45VR.js +2 -0
  51. package/dist/chunk-RLYTX3MM.js +2 -0
  52. package/dist/chunk-RNTNHVKZ.js +15 -0
  53. package/dist/chunk-RRVKUCFR.mjs +2 -0
  54. package/dist/chunk-RXL6CZAI.js +2 -0
  55. package/dist/chunk-RY3PGVLZ.mjs +2 -0
  56. package/dist/chunk-SUEGUY35.js +2 -0
  57. package/dist/chunk-SYMQJO2W.mjs +7 -0
  58. package/dist/chunk-TCN22KYP.mjs +7 -0
  59. package/dist/chunk-UFPSUO52.js +318 -0
  60. package/dist/chunk-VTITKWGX.mjs +2 -0
  61. package/dist/chunk-WH6ZMUOS.mjs +81 -0
  62. package/dist/chunk-WTJGLNTB.js +3 -0
  63. package/dist/chunk-XHROISIF.mjs +2 -0
  64. package/dist/chunk-XMBSJJ5U.js +4 -0
  65. package/dist/chunk-XSEZDQLB.js +2 -0
  66. package/dist/chunk-Z6IIMLZU.mjs +2 -0
  67. package/dist/chunk-ZLSWOFAY.mjs +132 -0
  68. package/dist/chunk-ZPKVLTSX.js +2 -0
  69. package/dist/consent.d.mts +6 -4
  70. package/dist/consent.d.ts +6 -4
  71. package/dist/consent.js +1 -1
  72. package/dist/consent.mjs +1 -1
  73. package/dist/core.d.mts +6 -25
  74. package/dist/core.d.ts +6 -25
  75. package/dist/core.js +1 -1
  76. package/dist/core.mjs +1 -1
  77. package/dist/cross-border.d.mts +2 -2
  78. package/dist/cross-border.d.ts +2 -2
  79. package/dist/cross-border.js +1 -1
  80. package/dist/cross-border.mjs +1 -1
  81. package/dist/docx-BxKascXN.d.ts +64 -0
  82. package/dist/docx-CV7Vsry_.d.mts +64 -0
  83. package/dist/dpia.js +1 -1
  84. package/dist/dpia.mjs +1 -1
  85. package/dist/dsr.js +1 -1
  86. package/dist/dsr.mjs +1 -1
  87. package/dist/hooks.d.mts +4 -4
  88. package/dist/hooks.d.ts +4 -4
  89. package/dist/hooks.js +1 -1
  90. package/dist/hooks.mjs +1 -1
  91. package/dist/index.d.mts +8 -6
  92. package/dist/index.d.ts +8 -6
  93. package/dist/index.js +1 -1
  94. package/dist/index.mjs +1 -1
  95. package/dist/lawful-basis.js +1 -1
  96. package/dist/lawful-basis.mjs +1 -1
  97. package/dist/locale-CxJx2tzn.d.mts +25 -0
  98. package/dist/locale-DSkrtf-c.d.ts +25 -0
  99. package/dist/{policy-engine-C6nC2t3a.d.ts → policy-engine-CCUCud2T.d.ts} +1 -1
  100. package/dist/{policy-engine-DefZcX3R.d.mts → policy-engine-fYSqEqSW.d.mts} +1 -1
  101. package/dist/{policy-sections-DFDPVCCg.d.ts → policy-sections-BYx6fEFk.d.ts} +4 -2
  102. package/dist/{policy-sections-Bylm31kZ.d.mts → policy-sections-Dm97Nq8m.d.mts} +4 -2
  103. package/dist/{policy-templates-CIKcV0i1.d.ts → policy-templates-DhLwq4R-.d.ts} +8 -1
  104. package/dist/{policy-templates-DMsPwOSZ.d.mts → policy-templates-DwYl2329.d.mts} +8 -1
  105. package/dist/policy.d.mts +36 -71
  106. package/dist/policy.d.ts +36 -71
  107. package/dist/policy.js +1 -1
  108. package/dist/policy.mjs +1 -1
  109. package/dist/presets.d.mts +2 -2
  110. package/dist/presets.d.ts +2 -2
  111. package/dist/presets.js +1 -1
  112. package/dist/presets.mjs +1 -1
  113. package/dist/ropa.js +1 -1
  114. package/dist/ropa.mjs +1 -1
  115. package/dist/sanitize-CxxwKxAx.d.mts +94 -0
  116. package/dist/sanitize-CxxwKxAx.d.ts +94 -0
  117. package/dist/server.d.mts +24 -0
  118. package/dist/server.d.ts +24 -0
  119. package/dist/server.js +2 -0
  120. package/dist/server.mjs +2 -0
  121. package/dist/styles.css +1423 -31
  122. package/dist/styling-BMDGQDgS.d.mts +64 -0
  123. package/dist/styling-BaoQtV06.d.ts +64 -0
  124. package/dist/unstyled.d.mts +52 -19
  125. package/dist/unstyled.d.ts +52 -19
  126. package/dist/unstyled.js +1 -1
  127. package/dist/unstyled.mjs +1 -1
  128. package/dist/{useAdaptivePolicyWizard-A1PyOy6P.d.mts → useAdaptivePolicyWizard-BnjW4OR4.d.mts} +1 -1
  129. package/dist/{useAdaptivePolicyWizard-LVIKhAxw.d.ts → useAdaptivePolicyWizard-sb3m4-Zk.d.ts} +1 -1
  130. package/dist/{useCrossBorderTransfer-BGNZt2lk.d.mts → useCrossBorderTransfer-DixjLjN1.d.mts} +1 -1
  131. package/dist/{useCrossBorderTransfer-COqjgjsu.d.ts → useCrossBorderTransfer-DvSq06lv.d.ts} +1 -1
  132. package/dist/{useDefaultPrivacyPolicy-BsYttRey.d.mts → useDefaultPrivacyPolicy-Cs2WQSYQ.d.mts} +34 -9
  133. package/dist/{useDefaultPrivacyPolicy-C-mG-A5S.d.ts → useDefaultPrivacyPolicy-DkOqMg2e.d.ts} +34 -9
  134. package/package.json +20 -6
  135. package/dist/chunk-256APOQM.js +0 -2
  136. package/dist/chunk-25OOUES4.js +0 -2
  137. package/dist/chunk-4JKTIR33.mjs +0 -2
  138. package/dist/chunk-5BUS6AI7.js +0 -2
  139. package/dist/chunk-6BXUVS6E.js +0 -81
  140. package/dist/chunk-6JCRDJQI.mjs +0 -2
  141. package/dist/chunk-6RQGQZT2.js +0 -2
  142. package/dist/chunk-6YN73KR7.mjs +0 -2
  143. package/dist/chunk-CDZDT2OS.mjs +0 -320
  144. package/dist/chunk-CSIJCLGZ.mjs +0 -2
  145. package/dist/chunk-CWUPGY3M.mjs +0 -3
  146. package/dist/chunk-E63VPR7U.js +0 -2
  147. package/dist/chunk-FDDI426Y.mjs +0 -2
  148. package/dist/chunk-GCQRHMTQ.mjs +0 -144
  149. package/dist/chunk-GMLCWGNJ.js +0 -7
  150. package/dist/chunk-GQVNLUP2.js +0 -94
  151. package/dist/chunk-GXLSOZCH.mjs +0 -2
  152. package/dist/chunk-IQJO7WIH.js +0 -7
  153. package/dist/chunk-LETEUS5X.mjs +0 -2
  154. package/dist/chunk-LU4PFST7.js +0 -144
  155. package/dist/chunk-M6XETYNL.js +0 -2
  156. package/dist/chunk-NBSVFQ5G.js +0 -2
  157. package/dist/chunk-NUDVUAD4.mjs +0 -81
  158. package/dist/chunk-NUULHXVL.mjs +0 -7
  159. package/dist/chunk-PM7O5IGE.mjs +0 -2
  160. package/dist/chunk-Q7VHB64E.mjs +0 -2
  161. package/dist/chunk-QDHHD2KR.mjs +0 -94
  162. package/dist/chunk-SAA7UVI2.js +0 -3
  163. package/dist/chunk-TI2M7H6R.mjs +0 -7
  164. package/dist/chunk-TKVJ3OOV.mjs +0 -2
  165. package/dist/chunk-TXXWCB5O.js +0 -320
  166. package/dist/chunk-UGY5ZYUG.js +0 -2
  167. package/dist/chunk-UO6QPJLH.js +0 -2
  168. package/dist/chunk-UX6ZZNEM.mjs +0 -3
  169. package/dist/chunk-VLSGE2YA.js +0 -2
  170. package/dist/chunk-XFUEZ3MP.mjs +0 -2
  171. package/dist/chunk-XHSHPB74.js +0 -2
  172. package/dist/chunk-YCX6BFOQ.js +0 -2
  173. package/dist/chunk-YURSF2YO.mjs +0 -2
  174. package/dist/chunk-YZXUAIYN.js +0 -3
  175. package/dist/chunk-ZGJA7OO4.js +0 -2
  176. package/dist/chunk-ZT7KNFAU.mjs +0 -2
package/dist/styles.css CHANGED
@@ -1,50 +1,1442 @@
1
- /* NDPA Toolkit Design Tokens */
1
+ /* ==========================================================================
2
+ * @tantainnovative/ndpr-toolkit — default component styles
3
+ *
4
+ * One stylesheet, no Tailwind dependency. Driven by --ndpr-* CSS custom
5
+ * properties so consumers can theme by overriding tokens at any level
6
+ * (`:root`, `[data-theme="dark"]`, or scoped to a wrapper).
7
+ *
8
+ * Import once in your app root:
9
+ *
10
+ * // app/layout.tsx (Next.js) or src/main.tsx (Vite/CRA)
11
+ * import "@tantainnovative/ndpr-toolkit/styles";
12
+ *
13
+ * Naming convention (BEM-ish, prefixed with `ndpr-`):
14
+ * .ndpr-{component} — component root
15
+ * .ndpr-{component}__{element} — child part
16
+ * .ndpr-{component}--{modifier} — variant or state
17
+ *
18
+ * If you want to opt out completely (build your own design system), import
19
+ * `@tantainnovative/ndpr-toolkit/unstyled` instead — components render with
20
+ * no class names so your CSS rules apply unfiltered.
21
+ * ========================================================================== */
22
+
23
+ /* ── Design tokens ─────────────────────────────────────────────────────── */
24
+
2
25
  :root {
3
- --ndpr-primary: 37 99 235; /* blue-600 RGB */
4
- --ndpr-primary-hover: 29 78 216; /* blue-700 RGB */
26
+ /* Colors light theme */
27
+ --ndpr-primary: 37 99 235; /* blue-600 RGB */
28
+ --ndpr-primary-hover: 29 78 216; /* blue-700 RGB */
5
29
  --ndpr-primary-foreground: 255 255 255;
6
30
  --ndpr-background: 255 255 255;
7
- --ndpr-foreground: 17 24 39; /* gray-900 RGB */
8
- --ndpr-muted: 243 244 246; /* gray-100 RGB */
31
+ --ndpr-surface: 249 250 251; /* gray-50 RGB */
32
+ --ndpr-foreground: 17 24 39; /* gray-900 RGB */
33
+ --ndpr-muted: 243 244 246; /* gray-100 RGB */
9
34
  --ndpr-muted-foreground: 107 114 128; /* gray-500 RGB */
10
- --ndpr-border: 229 231 235; /* gray-200 RGB */
35
+ --ndpr-border: 229 231 235; /* gray-200 RGB */
11
36
  --ndpr-input: 229 231 235;
12
37
  --ndpr-ring: 37 99 235;
13
- --ndpr-radius: 0.375rem;
14
- --ndpr-success: 22 163 74; /* green-600 RGB */
15
- --ndpr-destructive: 220 38 38; /* red-600 RGB */
16
- --ndpr-warning: 217 119 6; /* amber-600 RGB */
38
+ --ndpr-success: 22 163 74; /* green-600 RGB */
39
+ --ndpr-destructive: 220 38 38; /* red-600 RGB */
40
+ --ndpr-warning: 217 119 6; /* amber-600 RGB */
41
+
42
+ /* Spacing scale */
43
+ --ndpr-space-1: 0.25rem;
44
+ --ndpr-space-2: 0.5rem;
45
+ --ndpr-space-3: 0.75rem;
46
+ --ndpr-space-4: 1rem;
47
+ --ndpr-space-5: 1.25rem;
48
+ --ndpr-space-6: 1.5rem;
49
+ --ndpr-space-8: 2rem;
50
+
51
+ /* Radii */
52
+ --ndpr-radius-sm: 0.25rem;
53
+ --ndpr-radius: 0.5rem;
54
+ --ndpr-radius-lg: 0.75rem;
55
+ --ndpr-radius-full: 9999px;
56
+
57
+ /* Shadows */
58
+ --ndpr-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.04);
59
+ --ndpr-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.06);
60
+ --ndpr-shadow-lg: 0 10px 25px -5px rgba(0, 0, 0, 0.10), 0 8px 10px -6px rgba(0, 0, 0, 0.08);
61
+
62
+ /* Typography */
63
+ --ndpr-font-sans: ui-sans-serif, -apple-system, BlinkMacSystemFont,
64
+ 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
65
+ --ndpr-font-size-xs: 0.75rem;
66
+ --ndpr-font-size-sm: 0.875rem;
67
+ --ndpr-font-size-base: 1rem;
68
+ --ndpr-font-size-lg: 1.125rem;
69
+ --ndpr-font-size-xl: 1.25rem;
70
+ --ndpr-line-height: 1.5;
71
+ --ndpr-line-height-tight: 1.25;
72
+
73
+ /* Motion */
74
+ --ndpr-transition: 150ms ease-out;
75
+ --ndpr-transition-slow: 300ms ease-out;
76
+
77
+ /* Z-index */
78
+ --ndpr-z-banner: 9999;
79
+ --ndpr-z-modal: 10000;
80
+
81
+ /* Layout */
82
+ --ndpr-max-width: 72rem;
17
83
  }
18
84
 
19
- .dark, [data-theme="dark"] {
20
- --ndpr-primary: 96 165 250; /* blue-400 RGB */
21
- --ndpr-primary-hover: 147 197 253; /* blue-300 RGB */
22
- --ndpr-primary-foreground: 255 255 255;
23
- --ndpr-background: 31 41 55; /* gray-800 RGB */
24
- --ndpr-foreground: 255 255 255;
25
- --ndpr-muted: 55 65 81; /* gray-700 RGB */
26
- --ndpr-muted-foreground: 156 163 175; /* gray-400 RGB */
27
- --ndpr-border: 75 85 99; /* gray-600 RGB */
85
+ /* Dark theme — both `prefers-color-scheme: dark` and explicit opt-in via
86
+ * the `data-theme="dark"` attribute or `.dark` class are supported. */
87
+ @media (prefers-color-scheme: dark) {
88
+ :root {
89
+ --ndpr-primary: 96 165 250;
90
+ --ndpr-primary-hover: 147 197 253;
91
+ --ndpr-background: 17 24 39;
92
+ --ndpr-surface: 31 41 55;
93
+ --ndpr-foreground: 243 244 246;
94
+ --ndpr-muted: 55 65 81;
95
+ --ndpr-muted-foreground: 156 163 175;
96
+ --ndpr-border: 75 85 99;
97
+ --ndpr-input: 75 85 99;
98
+ --ndpr-ring: 96 165 250;
99
+ }
100
+ }
101
+
102
+ [data-theme="dark"],
103
+ .dark {
104
+ --ndpr-primary: 96 165 250;
105
+ --ndpr-primary-hover: 147 197 253;
106
+ --ndpr-background: 17 24 39;
107
+ --ndpr-surface: 31 41 55;
108
+ --ndpr-foreground: 243 244 246;
109
+ --ndpr-muted: 55 65 81;
110
+ --ndpr-muted-foreground: 156 163 175;
111
+ --ndpr-border: 75 85 99;
28
112
  --ndpr-input: 75 85 99;
29
113
  --ndpr-ring: 96 165 250;
30
114
  }
31
115
 
32
- /* Keep existing animation keyframes */
33
- @keyframes slide-in-bottom {
34
- from { transform: translateY(100%); }
35
- to { transform: translateY(0); }
116
+ [data-theme="light"] {
117
+ --ndpr-primary: 37 99 235;
118
+ --ndpr-primary-hover: 29 78 216;
119
+ --ndpr-background: 255 255 255;
120
+ --ndpr-surface: 249 250 251;
121
+ --ndpr-foreground: 17 24 39;
122
+ --ndpr-muted: 243 244 246;
123
+ --ndpr-muted-foreground: 107 114 128;
124
+ --ndpr-border: 229 231 235;
125
+ --ndpr-input: 229 231 235;
126
+ --ndpr-ring: 37 99 235;
127
+ }
128
+
129
+ /* ── Base / cross-cutting ──────────────────────────────────────────────── */
130
+
131
+ [data-ndpr-component] {
132
+ font-family: var(--ndpr-font-sans);
133
+ font-size: var(--ndpr-font-size-base);
134
+ line-height: var(--ndpr-line-height);
135
+ color: rgb(var(--ndpr-foreground));
136
+ box-sizing: border-box;
137
+ }
138
+
139
+ [data-ndpr-component] *,
140
+ [data-ndpr-component] *::before,
141
+ [data-ndpr-component] *::after {
142
+ box-sizing: border-box;
143
+ }
144
+
145
+ [data-ndpr-component] :focus-visible {
146
+ outline: 2px solid rgb(var(--ndpr-ring));
147
+ outline-offset: 2px;
148
+ border-radius: var(--ndpr-radius-sm);
149
+ }
150
+
151
+ /* ── Animations ────────────────────────────────────────────────────────── */
152
+
153
+ @keyframes ndpr-slide-in-bottom {
154
+ from { transform: translateY(100%); opacity: 0; }
155
+ to { transform: translateY(0); opacity: 1; }
36
156
  }
37
157
 
38
- @keyframes slide-in-top {
39
- from { transform: translateY(-100%); }
40
- to { transform: translateY(0); }
158
+ @keyframes ndpr-slide-in-top {
159
+ from { transform: translateY(-100%); opacity: 0; }
160
+ to { transform: translateY(0); opacity: 1; }
41
161
  }
42
162
 
43
- @keyframes fade-in {
163
+ @keyframes ndpr-fade-in {
44
164
  from { opacity: 0; }
45
- to { opacity: 1; }
165
+ to { opacity: 1; }
166
+ }
167
+
168
+ @keyframes ndpr-scale-in {
169
+ from { transform: scale(0.96); opacity: 0; }
170
+ to { transform: scale(1); opacity: 1; }
171
+ }
172
+
173
+ /* Legacy alias — kept for backward compat with any consumer relying on the
174
+ * pre-3.5 animation classes shipped via animations.css. */
175
+ .animate-slide-in { animation: ndpr-slide-in-bottom var(--ndpr-transition-slow); }
176
+ .animate-slide-in-top { animation: ndpr-slide-in-top var(--ndpr-transition-slow); }
177
+ .animate-fade-in { animation: ndpr-fade-in var(--ndpr-transition-slow); }
178
+
179
+ /* ── ConsentBanner ─────────────────────────────────────────────────────── */
180
+
181
+ .ndpr-consent-banner {
182
+ background: rgb(var(--ndpr-background));
183
+ color: rgb(var(--ndpr-foreground));
184
+ border: 1px solid rgb(var(--ndpr-border));
185
+ box-shadow: var(--ndpr-shadow-lg);
186
+ padding: var(--ndpr-space-4);
187
+ animation: ndpr-fade-in var(--ndpr-transition-slow);
188
+ }
189
+
190
+ @media (min-width: 640px) {
191
+ .ndpr-consent-banner {
192
+ padding: var(--ndpr-space-6);
193
+ }
194
+ }
195
+
196
+ /* Position modifiers */
197
+ .ndpr-consent-banner--bottom,
198
+ .ndpr-consent-banner--top {
199
+ position: fixed;
200
+ left: 0;
201
+ right: 0;
202
+ z-index: var(--ndpr-z-banner);
203
+ border-radius: 0;
204
+ }
205
+
206
+ .ndpr-consent-banner--bottom {
207
+ bottom: 0;
208
+ border-bottom: none;
209
+ border-left: none;
210
+ border-right: none;
211
+ animation: ndpr-slide-in-bottom var(--ndpr-transition-slow);
212
+ }
213
+
214
+ .ndpr-consent-banner--top {
215
+ top: 0;
216
+ border-top: none;
217
+ border-left: none;
218
+ border-right: none;
219
+ animation: ndpr-slide-in-top var(--ndpr-transition-slow);
220
+ }
221
+
222
+ .ndpr-consent-banner--inline {
223
+ border-radius: var(--ndpr-radius-lg);
224
+ }
225
+
226
+ /* Variant modifiers */
227
+ .ndpr-consent-banner--card {
228
+ border-radius: var(--ndpr-radius-lg);
229
+ margin: var(--ndpr-space-4);
230
+ max-width: 32rem;
231
+ }
232
+
233
+ .ndpr-consent-banner--card.ndpr-consent-banner--bottom {
234
+ bottom: var(--ndpr-space-4);
235
+ left: auto;
236
+ right: var(--ndpr-space-4);
237
+ }
238
+
239
+ .ndpr-consent-banner--card.ndpr-consent-banner--top {
240
+ top: var(--ndpr-space-4);
241
+ left: auto;
242
+ right: var(--ndpr-space-4);
243
+ }
244
+
245
+ .ndpr-consent-banner--modal {
246
+ border-radius: var(--ndpr-radius-lg);
247
+ max-width: 32rem;
248
+ margin: 0;
249
+ animation: ndpr-scale-in var(--ndpr-transition-slow);
250
+ }
251
+
252
+ .ndpr-consent-banner__overlay {
253
+ position: fixed;
254
+ inset: 0;
255
+ background: rgba(0, 0, 0, 0.5);
256
+ z-index: var(--ndpr-z-modal);
257
+ display: flex;
258
+ align-items: center;
259
+ justify-content: center;
260
+ padding: var(--ndpr-space-4);
261
+ animation: ndpr-fade-in var(--ndpr-transition);
262
+ }
263
+
264
+ .ndpr-consent-banner__container {
265
+ max-width: var(--ndpr-max-width);
266
+ margin: 0 auto;
267
+ }
268
+
269
+ .ndpr-consent-banner__title {
270
+ margin: 0 0 var(--ndpr-space-2);
271
+ font-size: var(--ndpr-font-size-lg);
272
+ font-weight: 700;
273
+ line-height: var(--ndpr-line-height-tight);
274
+ color: rgb(var(--ndpr-foreground));
275
+ }
276
+
277
+ .ndpr-consent-banner__description {
278
+ margin: 0 0 var(--ndpr-space-4);
279
+ font-size: var(--ndpr-font-size-sm);
280
+ color: rgb(var(--ndpr-muted-foreground));
281
+ }
282
+
283
+ @media (min-width: 640px) {
284
+ .ndpr-consent-banner__description {
285
+ font-size: var(--ndpr-font-size-base);
286
+ }
287
+ }
288
+
289
+ .ndpr-consent-banner__customize-panel {
290
+ margin-bottom: var(--ndpr-space-4);
291
+ padding: var(--ndpr-space-4);
292
+ background: rgb(var(--ndpr-surface));
293
+ border: 1px solid rgb(var(--ndpr-border));
294
+ border-radius: var(--ndpr-radius);
295
+ overflow: hidden;
296
+ transition: max-height var(--ndpr-transition-slow), opacity var(--ndpr-transition-slow);
297
+ }
298
+
299
+ .ndpr-consent-banner__select-all-row {
300
+ display: flex;
301
+ justify-content: flex-end;
302
+ margin-bottom: var(--ndpr-space-3);
303
+ }
304
+
305
+ .ndpr-consent-banner__select-all-button {
306
+ background: transparent;
307
+ border: 0;
308
+ padding: 0;
309
+ font-size: var(--ndpr-font-size-sm);
310
+ font-weight: 600;
311
+ color: rgb(var(--ndpr-primary));
312
+ cursor: pointer;
313
+ }
314
+
315
+ .ndpr-consent-banner__select-all-button:hover {
316
+ text-decoration: underline;
317
+ }
318
+
319
+ .ndpr-consent-banner__options-list {
320
+ display: flex;
321
+ flex-direction: column;
322
+ gap: var(--ndpr-space-3);
323
+ margin: 0;
324
+ padding: 0;
325
+ list-style: none;
326
+ }
327
+
328
+ .ndpr-consent-banner__option {
329
+ display: flex;
330
+ align-items: flex-start;
331
+ gap: var(--ndpr-space-3);
332
+ }
333
+
334
+ .ndpr-consent-banner__option-checkbox {
335
+ width: 1rem;
336
+ height: 1rem;
337
+ margin-top: 0.2rem;
338
+ accent-color: rgb(var(--ndpr-primary));
339
+ flex-shrink: 0;
340
+ cursor: pointer;
341
+ }
342
+
343
+ .ndpr-consent-banner__option-checkbox:disabled {
344
+ cursor: not-allowed;
345
+ opacity: 0.6;
346
+ }
347
+
348
+ .ndpr-consent-banner__option-text {
349
+ flex: 1;
350
+ font-size: var(--ndpr-font-size-sm);
351
+ }
352
+
353
+ .ndpr-consent-banner__option-label {
354
+ display: block;
355
+ font-weight: 600;
356
+ color: rgb(var(--ndpr-foreground));
357
+ cursor: pointer;
358
+ }
359
+
360
+ .ndpr-consent-banner__required-marker {
361
+ color: rgb(var(--ndpr-destructive));
362
+ margin-left: var(--ndpr-space-1);
363
+ }
364
+
365
+ .ndpr-consent-banner__option-description {
366
+ margin: var(--ndpr-space-1) 0 0;
367
+ color: rgb(var(--ndpr-muted-foreground));
368
+ font-size: var(--ndpr-font-size-sm);
369
+ line-height: var(--ndpr-line-height);
370
+ }
371
+
372
+ .ndpr-consent-banner__buttons {
373
+ display: flex;
374
+ flex-direction: column;
375
+ gap: var(--ndpr-space-2);
376
+ margin-top: var(--ndpr-space-4);
377
+ }
378
+
379
+ @media (min-width: 640px) {
380
+ .ndpr-consent-banner__buttons {
381
+ flex-direction: row;
382
+ flex-wrap: wrap;
383
+ }
384
+ }
385
+
386
+ .ndpr-consent-banner__button {
387
+ appearance: none;
388
+ display: inline-flex;
389
+ align-items: center;
390
+ justify-content: center;
391
+ padding: var(--ndpr-space-2) var(--ndpr-space-4);
392
+ border: 1px solid transparent;
393
+ border-radius: var(--ndpr-radius);
394
+ font-size: var(--ndpr-font-size-sm);
395
+ font-weight: 600;
396
+ font-family: inherit;
397
+ line-height: 1.25;
398
+ cursor: pointer;
399
+ transition: background var(--ndpr-transition), border-color var(--ndpr-transition), color var(--ndpr-transition);
400
+ user-select: none;
401
+ }
402
+
403
+ .ndpr-consent-banner__button:disabled {
404
+ cursor: not-allowed;
405
+ opacity: 0.6;
406
+ }
407
+
408
+ .ndpr-consent-banner__button--primary {
409
+ background: rgb(var(--ndpr-primary));
410
+ color: rgb(var(--ndpr-primary-foreground));
411
+ }
412
+
413
+ .ndpr-consent-banner__button--primary:hover:not(:disabled) {
414
+ background: rgb(var(--ndpr-primary-hover));
415
+ }
416
+
417
+ .ndpr-consent-banner__button--secondary {
418
+ background: rgb(var(--ndpr-muted));
419
+ color: rgb(var(--ndpr-foreground));
420
+ border-color: rgb(var(--ndpr-border));
421
+ }
422
+
423
+ .ndpr-consent-banner__button--secondary:hover:not(:disabled) {
424
+ background: rgb(var(--ndpr-border));
425
+ }
426
+
427
+ .ndpr-consent-banner__button--ghost {
428
+ background: transparent;
429
+ color: rgb(var(--ndpr-foreground));
430
+ }
431
+
432
+ .ndpr-consent-banner__button--ghost:hover:not(:disabled) {
433
+ background: rgb(var(--ndpr-muted));
434
+ }
435
+
436
+ .ndpr-consent-banner__footer-text {
437
+ margin-top: var(--ndpr-space-2);
438
+ font-size: var(--ndpr-font-size-xs);
439
+ color: rgb(var(--ndpr-muted-foreground));
440
+ }
441
+
442
+ /* ── ConsentManager (settings-page surface) ────────────────────────────── */
443
+
444
+ .ndpr-consent-manager {
445
+ background: rgb(var(--ndpr-background));
446
+ color: rgb(var(--ndpr-foreground));
447
+ border: 1px solid rgb(var(--ndpr-border));
448
+ border-radius: var(--ndpr-radius-lg);
449
+ box-shadow: var(--ndpr-shadow);
450
+ padding: var(--ndpr-space-6);
451
+ }
452
+
453
+ .ndpr-consent-manager__title {
454
+ margin: 0 0 var(--ndpr-space-2);
455
+ font-size: var(--ndpr-font-size-xl);
456
+ font-weight: 700;
457
+ line-height: var(--ndpr-line-height-tight);
458
+ }
459
+
460
+ .ndpr-consent-manager__description {
461
+ margin: 0 0 var(--ndpr-space-6);
462
+ color: rgb(var(--ndpr-muted-foreground));
463
+ font-size: var(--ndpr-font-size-sm);
464
+ }
465
+
466
+ .ndpr-consent-manager__options-list {
467
+ display: flex;
468
+ flex-direction: column;
469
+ margin: 0;
470
+ padding: 0;
471
+ list-style: none;
472
+ }
473
+
474
+ .ndpr-consent-manager__option {
475
+ display: flex;
476
+ align-items: flex-start;
477
+ justify-content: space-between;
478
+ gap: var(--ndpr-space-4);
479
+ padding: var(--ndpr-space-4) 0;
480
+ border-bottom: 1px solid rgb(var(--ndpr-border));
481
+ }
482
+
483
+ .ndpr-consent-manager__option:last-child {
484
+ border-bottom: 0;
485
+ }
486
+
487
+ .ndpr-consent-manager__option-info {
488
+ flex: 1;
489
+ min-width: 0;
490
+ }
491
+
492
+ .ndpr-consent-manager__option-label {
493
+ margin: 0;
494
+ font-weight: 600;
495
+ font-size: var(--ndpr-font-size-base);
496
+ color: rgb(var(--ndpr-foreground));
497
+ }
498
+
499
+ .ndpr-consent-manager__option-description {
500
+ margin: var(--ndpr-space-1) 0 0;
501
+ color: rgb(var(--ndpr-muted-foreground));
502
+ font-size: var(--ndpr-font-size-sm);
503
+ }
504
+
505
+ .ndpr-consent-manager__toggle-wrapper {
506
+ display: inline-flex;
507
+ align-items: center;
508
+ gap: var(--ndpr-space-3);
509
+ cursor: pointer;
510
+ flex-shrink: 0;
511
+ }
512
+
513
+ /* Pure-CSS switch — checkbox visually hidden, label fakes the toggle. */
514
+ .ndpr-consent-manager__toggle-input {
515
+ position: absolute;
516
+ width: 1px;
517
+ height: 1px;
518
+ padding: 0;
519
+ margin: -1px;
520
+ overflow: hidden;
521
+ clip: rect(0, 0, 0, 0);
522
+ white-space: nowrap;
523
+ border: 0;
524
+ }
525
+
526
+ .ndpr-consent-manager__toggle {
527
+ position: relative;
528
+ width: 2.75rem;
529
+ height: 1.5rem;
530
+ background: rgb(var(--ndpr-muted));
531
+ border: 1px solid rgb(var(--ndpr-border));
532
+ border-radius: var(--ndpr-radius-full);
533
+ transition: background var(--ndpr-transition);
534
+ flex-shrink: 0;
535
+ }
536
+
537
+ .ndpr-consent-manager__toggle::after {
538
+ content: '';
539
+ position: absolute;
540
+ top: 1px;
541
+ left: 1px;
542
+ width: 1.25rem;
543
+ height: 1.25rem;
544
+ background: rgb(var(--ndpr-background));
545
+ border-radius: 50%;
546
+ box-shadow: var(--ndpr-shadow-sm);
547
+ transition: transform var(--ndpr-transition);
548
+ }
549
+
550
+ .ndpr-consent-manager__toggle-input:checked + .ndpr-consent-manager__toggle {
551
+ background: rgb(var(--ndpr-primary));
552
+ border-color: rgb(var(--ndpr-primary));
553
+ }
554
+
555
+ .ndpr-consent-manager__toggle-input:checked + .ndpr-consent-manager__toggle::after {
556
+ transform: translateX(1.25rem);
557
+ }
558
+
559
+ .ndpr-consent-manager__toggle-input:focus-visible + .ndpr-consent-manager__toggle {
560
+ outline: 2px solid rgb(var(--ndpr-ring));
561
+ outline-offset: 2px;
562
+ }
563
+
564
+ .ndpr-consent-manager__toggle-input:disabled + .ndpr-consent-manager__toggle {
565
+ opacity: 0.6;
566
+ cursor: not-allowed;
567
+ }
568
+
569
+ .ndpr-consent-manager__toggle-status {
570
+ font-size: var(--ndpr-font-size-sm);
571
+ font-weight: 500;
572
+ color: rgb(var(--ndpr-foreground));
573
+ }
574
+
575
+ .ndpr-consent-manager__required-marker {
576
+ margin-left: var(--ndpr-space-1);
577
+ font-size: var(--ndpr-font-size-xs);
578
+ color: rgb(var(--ndpr-destructive));
579
+ }
580
+
581
+ .ndpr-consent-manager__success {
582
+ margin-top: var(--ndpr-space-4);
583
+ padding: var(--ndpr-space-3) var(--ndpr-space-4);
584
+ background: rgb(var(--ndpr-success) / 0.12);
585
+ color: rgb(var(--ndpr-success));
586
+ border: 1px solid rgb(var(--ndpr-success) / 0.3);
587
+ border-radius: var(--ndpr-radius);
588
+ font-size: var(--ndpr-font-size-sm);
589
+ }
590
+
591
+ .ndpr-consent-manager__buttons {
592
+ margin-top: var(--ndpr-space-6);
593
+ display: flex;
594
+ flex-wrap: wrap;
595
+ gap: var(--ndpr-space-3);
596
+ }
597
+
598
+ .ndpr-consent-manager__button {
599
+ appearance: none;
600
+ display: inline-flex;
601
+ align-items: center;
602
+ justify-content: center;
603
+ padding: var(--ndpr-space-2) var(--ndpr-space-4);
604
+ border: 1px solid transparent;
605
+ border-radius: var(--ndpr-radius);
606
+ font-size: var(--ndpr-font-size-sm);
607
+ font-weight: 600;
608
+ font-family: inherit;
609
+ line-height: 1.25;
610
+ cursor: pointer;
611
+ transition: background var(--ndpr-transition), border-color var(--ndpr-transition);
612
+ }
613
+
614
+ .ndpr-consent-manager__button--primary {
615
+ background: rgb(var(--ndpr-primary));
616
+ color: rgb(var(--ndpr-primary-foreground));
617
+ }
618
+
619
+ .ndpr-consent-manager__button--primary:hover:not(:disabled) {
620
+ background: rgb(var(--ndpr-primary-hover));
621
+ }
622
+
623
+ .ndpr-consent-manager__button--secondary {
624
+ background: rgb(var(--ndpr-muted));
625
+ color: rgb(var(--ndpr-foreground));
626
+ border-color: rgb(var(--ndpr-border));
627
+ }
628
+
629
+ .ndpr-consent-manager__button--secondary:hover:not(:disabled) {
630
+ background: rgb(var(--ndpr-border));
631
+ }
632
+
633
+ .ndpr-consent-manager__meta {
634
+ margin-top: var(--ndpr-space-4);
635
+ display: flex;
636
+ flex-wrap: wrap;
637
+ gap: var(--ndpr-space-1) var(--ndpr-space-4);
638
+ font-size: var(--ndpr-font-size-xs);
639
+ color: rgb(var(--ndpr-muted-foreground));
640
+ }
641
+
642
+ .ndpr-consent-manager__meta p {
643
+ margin: 0;
644
+ }
645
+
646
+ /* ── Form primitives (shared by DSR / Breach / DPIA / ROPA forms) ──────── */
647
+
648
+ .ndpr-form-field {
649
+ display: flex;
650
+ flex-direction: column;
651
+ gap: var(--ndpr-space-1);
652
+ }
653
+
654
+ .ndpr-form-field__label {
655
+ display: block;
656
+ font-size: var(--ndpr-font-size-sm);
657
+ font-weight: 500;
658
+ color: rgb(var(--ndpr-foreground));
659
+ }
660
+
661
+ .ndpr-form-field__required {
662
+ margin-left: var(--ndpr-space-1);
663
+ color: rgb(var(--ndpr-destructive));
664
+ }
665
+
666
+ .ndpr-form-field__input,
667
+ .ndpr-form-field__select,
668
+ .ndpr-form-field__textarea {
669
+ width: 100%;
670
+ padding: var(--ndpr-space-2) var(--ndpr-space-3);
671
+ font-size: var(--ndpr-font-size-base);
672
+ font-family: inherit;
673
+ color: rgb(var(--ndpr-foreground));
674
+ background: rgb(var(--ndpr-background));
675
+ border: 1px solid rgb(var(--ndpr-input));
676
+ border-radius: var(--ndpr-radius);
677
+ transition: border-color var(--ndpr-transition), box-shadow var(--ndpr-transition);
678
+ outline: none;
679
+ appearance: none;
680
+ }
681
+
682
+ .ndpr-form-field__textarea {
683
+ min-height: 6rem;
684
+ resize: vertical;
685
+ line-height: var(--ndpr-line-height);
686
+ }
687
+
688
+ .ndpr-form-field__input:focus,
689
+ .ndpr-form-field__select:focus,
690
+ .ndpr-form-field__textarea:focus {
691
+ border-color: rgb(var(--ndpr-primary));
692
+ box-shadow: 0 0 0 3px rgb(var(--ndpr-ring) / 0.25);
693
+ }
694
+
695
+ .ndpr-form-field__input:disabled,
696
+ .ndpr-form-field__select:disabled,
697
+ .ndpr-form-field__textarea:disabled {
698
+ background: rgb(var(--ndpr-muted));
699
+ cursor: not-allowed;
700
+ }
701
+
702
+ .ndpr-form-field__input[aria-invalid="true"],
703
+ .ndpr-form-field__select[aria-invalid="true"],
704
+ .ndpr-form-field__textarea[aria-invalid="true"] {
705
+ border-color: rgb(var(--ndpr-destructive));
706
+ }
707
+
708
+ .ndpr-form-field__input[aria-invalid="true"]:focus,
709
+ .ndpr-form-field__select[aria-invalid="true"]:focus,
710
+ .ndpr-form-field__textarea[aria-invalid="true"]:focus {
711
+ box-shadow: 0 0 0 3px rgb(var(--ndpr-destructive) / 0.25);
712
+ }
713
+
714
+ .ndpr-form-field__error {
715
+ margin: var(--ndpr-space-1) 0 0;
716
+ font-size: var(--ndpr-font-size-sm);
717
+ color: rgb(var(--ndpr-destructive));
718
+ }
719
+
720
+ .ndpr-form-field__hint {
721
+ margin: var(--ndpr-space-1) 0 0;
722
+ font-size: var(--ndpr-font-size-sm);
723
+ color: rgb(var(--ndpr-muted-foreground));
724
+ }
725
+
726
+ .ndpr-form-field__checkbox-row {
727
+ display: flex;
728
+ align-items: flex-start;
729
+ gap: var(--ndpr-space-3);
730
+ }
731
+
732
+ .ndpr-form-field__checkbox,
733
+ .ndpr-form-field__radio {
734
+ width: 1rem;
735
+ height: 1rem;
736
+ margin-top: 0.2rem;
737
+ accent-color: rgb(var(--ndpr-primary));
738
+ flex-shrink: 0;
739
+ cursor: pointer;
740
+ }
741
+
742
+ .ndpr-form-field__option-group {
743
+ display: flex;
744
+ flex-direction: column;
745
+ gap: var(--ndpr-space-2);
746
+ }
747
+
748
+ .ndpr-form-field__input--mono {
749
+ font-family: var(--ndpr-font-mono, ui-monospace, 'Cascadia Code', Menlo, monospace);
750
+ font-size: var(--ndpr-font-size-sm);
751
+ }
752
+
753
+ .ndpr-form-section {
754
+ display: flex;
755
+ flex-direction: column;
756
+ gap: var(--ndpr-space-4);
46
757
  }
47
758
 
48
- .animate-slide-in { animation: slide-in-bottom 0.3s ease-out; }
49
- .animate-slide-in-top { animation: slide-in-top 0.3s ease-out; }
50
- .animate-fade-in { animation: fade-in 0.3s ease-out; }
759
+ .ndpr-form-section__heading {
760
+ margin: 0 0 var(--ndpr-space-3);
761
+ font-size: var(--ndpr-font-size-lg);
762
+ font-weight: 600;
763
+ color: rgb(var(--ndpr-foreground));
764
+ }
765
+
766
+ .ndpr-form-section__hint {
767
+ margin: 0 0 var(--ndpr-space-3);
768
+ font-size: var(--ndpr-font-size-sm);
769
+ color: rgb(var(--ndpr-muted-foreground));
770
+ }
771
+
772
+ .ndpr-form-grid {
773
+ display: grid;
774
+ grid-template-columns: 1fr;
775
+ gap: var(--ndpr-space-4);
776
+ }
777
+
778
+ @media (min-width: 640px) {
779
+ .ndpr-form-grid--2 {
780
+ grid-template-columns: 1fr 1fr;
781
+ }
782
+ }
783
+
784
+ /* ── DSRRequestForm ────────────────────────────────────────────────────── */
785
+
786
+ .ndpr-dsr-form {
787
+ background: rgb(var(--ndpr-background));
788
+ color: rgb(var(--ndpr-foreground));
789
+ border: 1px solid rgb(var(--ndpr-border));
790
+ border-radius: var(--ndpr-radius-lg);
791
+ box-shadow: var(--ndpr-shadow);
792
+ padding: var(--ndpr-space-6);
793
+ }
794
+
795
+ .ndpr-dsr-form__title {
796
+ margin: 0 0 var(--ndpr-space-2);
797
+ font-size: var(--ndpr-font-size-xl);
798
+ font-weight: 700;
799
+ line-height: var(--ndpr-line-height-tight);
800
+ }
801
+
802
+ .ndpr-dsr-form__description {
803
+ margin: 0 0 var(--ndpr-space-6);
804
+ color: rgb(var(--ndpr-muted-foreground));
805
+ font-size: var(--ndpr-font-size-sm);
806
+ }
807
+
808
+ .ndpr-dsr-form__sections {
809
+ display: flex;
810
+ flex-direction: column;
811
+ gap: var(--ndpr-space-6);
812
+ }
813
+
814
+ .ndpr-dsr-form__type-info {
815
+ margin: var(--ndpr-space-3) 0;
816
+ padding: var(--ndpr-space-3) var(--ndpr-space-4);
817
+ background: rgb(var(--ndpr-surface));
818
+ border: 1px solid rgb(var(--ndpr-border));
819
+ border-radius: var(--ndpr-radius);
820
+ font-size: var(--ndpr-font-size-sm);
821
+ color: rgb(var(--ndpr-muted-foreground));
822
+ }
823
+
824
+ .ndpr-dsr-form__type-info p {
825
+ margin: 0;
826
+ }
827
+
828
+ .ndpr-dsr-form__type-info p + p {
829
+ margin-top: var(--ndpr-space-1);
830
+ }
831
+
832
+ .ndpr-dsr-form__notice {
833
+ margin-top: var(--ndpr-space-2);
834
+ padding: var(--ndpr-space-4);
835
+ background: rgb(var(--ndpr-surface));
836
+ border: 1px solid rgb(var(--ndpr-border));
837
+ border-radius: var(--ndpr-radius);
838
+ }
839
+
840
+ .ndpr-dsr-form__notice-title {
841
+ margin: 0 0 var(--ndpr-space-2);
842
+ font-size: var(--ndpr-font-size-sm);
843
+ font-weight: 600;
844
+ }
845
+
846
+ .ndpr-dsr-form__notice-body {
847
+ margin: 0;
848
+ font-size: var(--ndpr-font-size-xs);
849
+ color: rgb(var(--ndpr-muted-foreground));
850
+ line-height: var(--ndpr-line-height);
851
+ }
852
+
853
+ .ndpr-dsr-form__actions {
854
+ display: flex;
855
+ flex-wrap: wrap;
856
+ gap: var(--ndpr-space-3);
857
+ margin-top: var(--ndpr-space-2);
858
+ position: relative;
859
+ }
860
+
861
+ .ndpr-dsr-form__button {
862
+ appearance: none;
863
+ display: inline-flex;
864
+ align-items: center;
865
+ justify-content: center;
866
+ padding: var(--ndpr-space-3) var(--ndpr-space-6);
867
+ border: 1px solid transparent;
868
+ border-radius: var(--ndpr-radius);
869
+ font-size: var(--ndpr-font-size-sm);
870
+ font-weight: 600;
871
+ font-family: inherit;
872
+ line-height: 1.25;
873
+ cursor: pointer;
874
+ transition: background var(--ndpr-transition), border-color var(--ndpr-transition);
875
+ }
876
+
877
+ .ndpr-dsr-form__button:disabled {
878
+ opacity: 0.5;
879
+ cursor: not-allowed;
880
+ }
881
+
882
+ .ndpr-dsr-form__button--primary {
883
+ background: rgb(var(--ndpr-primary));
884
+ color: rgb(var(--ndpr-primary-foreground));
885
+ }
886
+
887
+ .ndpr-dsr-form__button--primary:hover:not(:disabled) {
888
+ background: rgb(var(--ndpr-primary-hover));
889
+ }
890
+
891
+ .ndpr-dsr-form__button--secondary {
892
+ background: rgb(var(--ndpr-muted));
893
+ color: rgb(var(--ndpr-foreground));
894
+ border-color: rgb(var(--ndpr-border));
895
+ }
896
+
897
+ .ndpr-dsr-form__button--secondary:hover:not(:disabled) {
898
+ background: rgb(var(--ndpr-border));
899
+ }
900
+
901
+ .ndpr-dsr-form__success {
902
+ background: rgb(var(--ndpr-success) / 0.08);
903
+ color: rgb(var(--ndpr-foreground));
904
+ border: 1px solid rgb(var(--ndpr-success) / 0.4);
905
+ border-radius: var(--ndpr-radius);
906
+ padding: var(--ndpr-space-6);
907
+ }
908
+
909
+ .ndpr-dsr-form__success-title {
910
+ margin: 0 0 var(--ndpr-space-2);
911
+ font-size: var(--ndpr-font-size-lg);
912
+ font-weight: 700;
913
+ color: rgb(var(--ndpr-success));
914
+ }
915
+
916
+ .ndpr-dsr-form__success-body {
917
+ margin: 0 0 var(--ndpr-space-4);
918
+ color: rgb(var(--ndpr-foreground));
919
+ font-size: var(--ndpr-font-size-sm);
920
+ }
921
+
922
+ /* ── Shared layout primitives ──────────────────────────────────────────── */
923
+
924
+ /* Generic surface card — used by every "manager" / "report" / "dashboard"
925
+ * component. Replaces the repeated
926
+ * `bg-white dark:bg-gray-800 border ... rounded-lg p-{4,6} shadow-md`
927
+ * pattern. */
928
+ .ndpr-card {
929
+ background: rgb(var(--ndpr-background));
930
+ color: rgb(var(--ndpr-foreground));
931
+ border: 1px solid rgb(var(--ndpr-border));
932
+ border-radius: var(--ndpr-radius-lg);
933
+ box-shadow: var(--ndpr-shadow);
934
+ padding: var(--ndpr-space-6);
935
+ }
936
+
937
+ .ndpr-card--compact { padding: var(--ndpr-space-4); }
938
+ .ndpr-card--flat { box-shadow: none; }
939
+ .ndpr-card--subtle {
940
+ background: rgb(var(--ndpr-surface));
941
+ box-shadow: none;
942
+ padding: var(--ndpr-space-4);
943
+ }
944
+
945
+ .ndpr-card__header {
946
+ display: flex;
947
+ align-items: flex-start;
948
+ justify-content: space-between;
949
+ gap: var(--ndpr-space-4);
950
+ margin-bottom: var(--ndpr-space-4);
951
+ }
952
+
953
+ .ndpr-card__title {
954
+ margin: 0;
955
+ font-size: var(--ndpr-font-size-lg);
956
+ font-weight: 600;
957
+ line-height: var(--ndpr-line-height-tight);
958
+ }
959
+
960
+ .ndpr-card__subtitle {
961
+ margin: var(--ndpr-space-1) 0 0;
962
+ font-size: var(--ndpr-font-size-sm);
963
+ color: rgb(var(--ndpr-muted-foreground));
964
+ }
965
+
966
+ .ndpr-card__body {
967
+ display: flex;
968
+ flex-direction: column;
969
+ gap: var(--ndpr-space-4);
970
+ }
971
+
972
+ .ndpr-card__footer {
973
+ display: flex;
974
+ flex-wrap: wrap;
975
+ gap: var(--ndpr-space-3);
976
+ margin-top: var(--ndpr-space-6);
977
+ padding-top: var(--ndpr-space-4);
978
+ border-top: 1px solid rgb(var(--ndpr-border));
979
+ }
980
+
981
+ /* Inline panel — light-surface inset for grouped content. */
982
+ .ndpr-panel {
983
+ background: rgb(var(--ndpr-surface));
984
+ border: 1px solid rgb(var(--ndpr-border));
985
+ border-radius: var(--ndpr-radius);
986
+ padding: var(--ndpr-space-3) var(--ndpr-space-4);
987
+ }
988
+
989
+ /* ── Status badges (pills) ─────────────────────────────────────────────── */
990
+
991
+ .ndpr-badge {
992
+ display: inline-flex;
993
+ align-items: center;
994
+ gap: var(--ndpr-space-1);
995
+ padding: 0.125rem var(--ndpr-space-2);
996
+ border-radius: var(--ndpr-radius-full);
997
+ font-size: var(--ndpr-font-size-xs);
998
+ font-weight: 600;
999
+ line-height: 1.4;
1000
+ border: 1px solid transparent;
1001
+ background: rgb(var(--ndpr-muted));
1002
+ color: rgb(var(--ndpr-foreground));
1003
+ }
1004
+
1005
+ .ndpr-badge--success {
1006
+ background: rgb(var(--ndpr-success) / 0.12);
1007
+ color: rgb(var(--ndpr-success));
1008
+ border-color: rgb(var(--ndpr-success) / 0.3);
1009
+ }
1010
+
1011
+ .ndpr-badge--warning {
1012
+ background: rgb(var(--ndpr-warning) / 0.12);
1013
+ color: rgb(var(--ndpr-warning));
1014
+ border-color: rgb(var(--ndpr-warning) / 0.3);
1015
+ }
1016
+
1017
+ .ndpr-badge--destructive,
1018
+ .ndpr-badge--danger {
1019
+ background: rgb(var(--ndpr-destructive) / 0.12);
1020
+ color: rgb(var(--ndpr-destructive));
1021
+ border-color: rgb(var(--ndpr-destructive) / 0.3);
1022
+ }
1023
+
1024
+ .ndpr-badge--info {
1025
+ background: rgb(var(--ndpr-primary) / 0.12);
1026
+ color: rgb(var(--ndpr-primary));
1027
+ border-color: rgb(var(--ndpr-primary) / 0.3);
1028
+ }
1029
+
1030
+ .ndpr-badge--neutral {
1031
+ background: rgb(var(--ndpr-muted));
1032
+ color: rgb(var(--ndpr-muted-foreground));
1033
+ border-color: rgb(var(--ndpr-border));
1034
+ }
1035
+
1036
+ /* ── Alert / callout blocks ────────────────────────────────────────────── */
1037
+
1038
+ .ndpr-alert {
1039
+ display: flex;
1040
+ flex-direction: column;
1041
+ gap: var(--ndpr-space-1);
1042
+ padding: var(--ndpr-space-3) var(--ndpr-space-4);
1043
+ border-radius: var(--ndpr-radius);
1044
+ border: 1px solid rgb(var(--ndpr-border));
1045
+ background: rgb(var(--ndpr-surface));
1046
+ color: rgb(var(--ndpr-foreground));
1047
+ font-size: var(--ndpr-font-size-sm);
1048
+ }
1049
+
1050
+ .ndpr-alert__title {
1051
+ margin: 0;
1052
+ font-weight: 600;
1053
+ }
1054
+
1055
+ .ndpr-alert__body {
1056
+ margin: 0;
1057
+ color: rgb(var(--ndpr-muted-foreground));
1058
+ }
1059
+
1060
+ .ndpr-alert--info {
1061
+ background: rgb(var(--ndpr-primary) / 0.08);
1062
+ border-color: rgb(var(--ndpr-primary) / 0.3);
1063
+ }
1064
+ .ndpr-alert--info .ndpr-alert__title { color: rgb(var(--ndpr-primary)); }
1065
+
1066
+ .ndpr-alert--success {
1067
+ background: rgb(var(--ndpr-success) / 0.08);
1068
+ border-color: rgb(var(--ndpr-success) / 0.3);
1069
+ }
1070
+ .ndpr-alert--success .ndpr-alert__title { color: rgb(var(--ndpr-success)); }
1071
+
1072
+ .ndpr-alert--warning {
1073
+ background: rgb(var(--ndpr-warning) / 0.08);
1074
+ border-color: rgb(var(--ndpr-warning) / 0.3);
1075
+ }
1076
+ .ndpr-alert--warning .ndpr-alert__title { color: rgb(var(--ndpr-warning)); }
1077
+
1078
+ .ndpr-alert--destructive,
1079
+ .ndpr-alert--danger {
1080
+ background: rgb(var(--ndpr-destructive) / 0.08);
1081
+ border-color: rgb(var(--ndpr-destructive) / 0.3);
1082
+ }
1083
+ .ndpr-alert--destructive .ndpr-alert__title,
1084
+ .ndpr-alert--danger .ndpr-alert__title { color: rgb(var(--ndpr-destructive)); }
1085
+
1086
+ /* ── Tables ────────────────────────────────────────────────────────────── */
1087
+
1088
+ .ndpr-table {
1089
+ width: 100%;
1090
+ border-collapse: collapse;
1091
+ font-size: var(--ndpr-font-size-sm);
1092
+ }
1093
+
1094
+ .ndpr-table__head {
1095
+ background: rgb(var(--ndpr-surface));
1096
+ text-align: left;
1097
+ font-size: var(--ndpr-font-size-xs);
1098
+ font-weight: 600;
1099
+ text-transform: uppercase;
1100
+ letter-spacing: 0.04em;
1101
+ color: rgb(var(--ndpr-muted-foreground));
1102
+ }
1103
+
1104
+ .ndpr-table__row {
1105
+ border-bottom: 1px solid rgb(var(--ndpr-border));
1106
+ }
1107
+
1108
+ .ndpr-table__row:last-child { border-bottom: 0; }
1109
+
1110
+ .ndpr-table__cell,
1111
+ .ndpr-table__heading {
1112
+ padding: var(--ndpr-space-3) var(--ndpr-space-4);
1113
+ vertical-align: top;
1114
+ }
1115
+
1116
+ .ndpr-table__heading {
1117
+ font-weight: 600;
1118
+ }
1119
+
1120
+ .ndpr-table__cell--muted {
1121
+ color: rgb(var(--ndpr-muted-foreground));
1122
+ }
1123
+
1124
+ .ndpr-table__cell--actions {
1125
+ text-align: right;
1126
+ white-space: nowrap;
1127
+ }
1128
+
1129
+ .ndpr-table-wrapper {
1130
+ overflow-x: auto;
1131
+ border: 1px solid rgb(var(--ndpr-border));
1132
+ border-radius: var(--ndpr-radius);
1133
+ }
1134
+
1135
+ /* ── Empty / placeholder states ────────────────────────────────────────── */
1136
+
1137
+ .ndpr-empty-state {
1138
+ display: flex;
1139
+ flex-direction: column;
1140
+ align-items: center;
1141
+ justify-content: center;
1142
+ gap: var(--ndpr-space-2);
1143
+ min-height: 12rem;
1144
+ padding: var(--ndpr-space-6);
1145
+ background: rgb(var(--ndpr-surface));
1146
+ border: 1px dashed rgb(var(--ndpr-border));
1147
+ border-radius: var(--ndpr-radius);
1148
+ color: rgb(var(--ndpr-muted-foreground));
1149
+ text-align: center;
1150
+ }
1151
+
1152
+ .ndpr-empty-state__title {
1153
+ margin: 0;
1154
+ font-size: var(--ndpr-font-size-base);
1155
+ font-weight: 600;
1156
+ color: rgb(var(--ndpr-foreground));
1157
+ }
1158
+
1159
+ .ndpr-empty-state__body {
1160
+ margin: 0;
1161
+ font-size: var(--ndpr-font-size-sm);
1162
+ }
1163
+
1164
+ /* ── Range / slider input ──────────────────────────────────────────────── */
1165
+
1166
+ .ndpr-form-field__range {
1167
+ width: 100%;
1168
+ height: 0.5rem;
1169
+ background: rgb(var(--ndpr-muted));
1170
+ border-radius: var(--ndpr-radius-full);
1171
+ appearance: none;
1172
+ cursor: pointer;
1173
+ outline: none;
1174
+ }
1175
+
1176
+ .ndpr-form-field__range::-webkit-slider-thumb {
1177
+ appearance: none;
1178
+ width: 1.125rem;
1179
+ height: 1.125rem;
1180
+ border-radius: 50%;
1181
+ background: rgb(var(--ndpr-primary));
1182
+ border: 2px solid rgb(var(--ndpr-background));
1183
+ box-shadow: var(--ndpr-shadow-sm);
1184
+ cursor: pointer;
1185
+ }
1186
+
1187
+ .ndpr-form-field__range::-moz-range-thumb {
1188
+ width: 1.125rem;
1189
+ height: 1.125rem;
1190
+ border-radius: 50%;
1191
+ background: rgb(var(--ndpr-primary));
1192
+ border: 2px solid rgb(var(--ndpr-background));
1193
+ box-shadow: var(--ndpr-shadow-sm);
1194
+ cursor: pointer;
1195
+ }
1196
+
1197
+ /* ── Generic button family (used across non-consent components) ────────── */
1198
+
1199
+ .ndpr-button {
1200
+ appearance: none;
1201
+ display: inline-flex;
1202
+ align-items: center;
1203
+ justify-content: center;
1204
+ gap: var(--ndpr-space-2);
1205
+ padding: var(--ndpr-space-2) var(--ndpr-space-4);
1206
+ border: 1px solid transparent;
1207
+ border-radius: var(--ndpr-radius);
1208
+ font-size: var(--ndpr-font-size-sm);
1209
+ font-weight: 600;
1210
+ font-family: inherit;
1211
+ line-height: 1.25;
1212
+ cursor: pointer;
1213
+ transition: background var(--ndpr-transition), border-color var(--ndpr-transition), color var(--ndpr-transition);
1214
+ text-decoration: none;
1215
+ }
1216
+
1217
+ .ndpr-button:disabled {
1218
+ opacity: 0.5;
1219
+ cursor: not-allowed;
1220
+ }
1221
+
1222
+ .ndpr-button--primary {
1223
+ background: rgb(var(--ndpr-primary));
1224
+ color: rgb(var(--ndpr-primary-foreground));
1225
+ }
1226
+ .ndpr-button--primary:hover:not(:disabled) {
1227
+ background: rgb(var(--ndpr-primary-hover));
1228
+ }
1229
+
1230
+ .ndpr-button--secondary {
1231
+ background: rgb(var(--ndpr-muted));
1232
+ color: rgb(var(--ndpr-foreground));
1233
+ border-color: rgb(var(--ndpr-border));
1234
+ }
1235
+ .ndpr-button--secondary:hover:not(:disabled) {
1236
+ background: rgb(var(--ndpr-border));
1237
+ }
1238
+
1239
+ .ndpr-button--ghost {
1240
+ background: transparent;
1241
+ color: rgb(var(--ndpr-foreground));
1242
+ }
1243
+ .ndpr-button--ghost:hover:not(:disabled) {
1244
+ background: rgb(var(--ndpr-muted));
1245
+ }
1246
+
1247
+ .ndpr-button--destructive {
1248
+ background: rgb(var(--ndpr-destructive));
1249
+ color: #fff;
1250
+ }
1251
+ .ndpr-button--destructive:hover:not(:disabled) {
1252
+ filter: brightness(0.92);
1253
+ }
1254
+
1255
+ .ndpr-button--sm {
1256
+ padding: var(--ndpr-space-1) var(--ndpr-space-3);
1257
+ font-size: var(--ndpr-font-size-xs);
1258
+ }
1259
+
1260
+ .ndpr-button--lg {
1261
+ padding: var(--ndpr-space-3) var(--ndpr-space-6);
1262
+ font-size: var(--ndpr-font-size-base);
1263
+ }
1264
+
1265
+ .ndpr-button--icon {
1266
+ padding: var(--ndpr-space-2);
1267
+ background: transparent;
1268
+ color: rgb(var(--ndpr-muted-foreground));
1269
+ }
1270
+ .ndpr-button--icon:hover:not(:disabled) {
1271
+ background: rgb(var(--ndpr-muted));
1272
+ color: rgb(var(--ndpr-foreground));
1273
+ }
1274
+
1275
+ /* ── Step indicator (DPIA / Policy wizards) ────────────────────────────── */
1276
+
1277
+ .ndpr-step-indicator {
1278
+ display: flex;
1279
+ align-items: flex-start;
1280
+ gap: var(--ndpr-space-2);
1281
+ width: 100%;
1282
+ margin-bottom: var(--ndpr-space-6);
1283
+ }
1284
+
1285
+ .ndpr-step-indicator__item {
1286
+ flex: 1;
1287
+ display: flex;
1288
+ flex-direction: column;
1289
+ align-items: center;
1290
+ text-align: center;
1291
+ position: relative;
1292
+ min-width: 0;
1293
+ }
1294
+
1295
+ .ndpr-step-indicator__item:not(:last-child)::after {
1296
+ content: '';
1297
+ position: absolute;
1298
+ top: 1rem;
1299
+ left: 50%;
1300
+ width: 100%;
1301
+ height: 2px;
1302
+ background: rgb(var(--ndpr-border));
1303
+ z-index: 0;
1304
+ }
1305
+
1306
+ .ndpr-step-indicator__item--complete:not(:last-child)::after {
1307
+ background: rgb(var(--ndpr-primary));
1308
+ }
1309
+
1310
+ .ndpr-step-indicator__bullet {
1311
+ position: relative;
1312
+ z-index: 1;
1313
+ width: 2rem;
1314
+ height: 2rem;
1315
+ border-radius: 50%;
1316
+ display: inline-flex;
1317
+ align-items: center;
1318
+ justify-content: center;
1319
+ font-size: var(--ndpr-font-size-sm);
1320
+ font-weight: 600;
1321
+ background: rgb(var(--ndpr-muted));
1322
+ color: rgb(var(--ndpr-muted-foreground));
1323
+ border: 2px solid rgb(var(--ndpr-border));
1324
+ }
1325
+
1326
+ .ndpr-step-indicator__item--current .ndpr-step-indicator__bullet {
1327
+ background: rgb(var(--ndpr-primary));
1328
+ color: rgb(var(--ndpr-primary-foreground));
1329
+ border-color: rgb(var(--ndpr-primary));
1330
+ }
1331
+
1332
+ .ndpr-step-indicator__item--complete .ndpr-step-indicator__bullet {
1333
+ background: rgb(var(--ndpr-success));
1334
+ color: #fff;
1335
+ border-color: rgb(var(--ndpr-success));
1336
+ }
1337
+
1338
+ .ndpr-step-indicator__label {
1339
+ margin-top: var(--ndpr-space-2);
1340
+ font-size: var(--ndpr-font-size-xs);
1341
+ color: rgb(var(--ndpr-muted-foreground));
1342
+ font-weight: 500;
1343
+ }
1344
+
1345
+ .ndpr-step-indicator__item--current .ndpr-step-indicator__label {
1346
+ color: rgb(var(--ndpr-foreground));
1347
+ font-weight: 600;
1348
+ }
1349
+
1350
+ /* ── Progress bar ──────────────────────────────────────────────────────── */
1351
+
1352
+ .ndpr-progress {
1353
+ width: 100%;
1354
+ height: 0.5rem;
1355
+ background: rgb(var(--ndpr-muted));
1356
+ border-radius: var(--ndpr-radius-full);
1357
+ overflow: hidden;
1358
+ }
1359
+
1360
+ .ndpr-progress__bar {
1361
+ height: 100%;
1362
+ background: rgb(var(--ndpr-primary));
1363
+ transition: width var(--ndpr-transition-slow);
1364
+ }
1365
+
1366
+ .ndpr-progress__bar--success { background: rgb(var(--ndpr-success)); }
1367
+ .ndpr-progress__bar--warning { background: rgb(var(--ndpr-warning)); }
1368
+ .ndpr-progress__bar--destructive { background: rgb(var(--ndpr-destructive)); }
1369
+
1370
+ /* ── Stat grid (NDPRDashboard, compliance reports) ─────────────────────── */
1371
+
1372
+ .ndpr-stat-grid {
1373
+ display: grid;
1374
+ grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
1375
+ gap: var(--ndpr-space-4);
1376
+ }
1377
+
1378
+ .ndpr-stat {
1379
+ background: rgb(var(--ndpr-surface));
1380
+ border: 1px solid rgb(var(--ndpr-border));
1381
+ border-radius: var(--ndpr-radius);
1382
+ padding: var(--ndpr-space-4);
1383
+ }
1384
+
1385
+ .ndpr-stat__label {
1386
+ margin: 0 0 var(--ndpr-space-1);
1387
+ font-size: var(--ndpr-font-size-xs);
1388
+ font-weight: 600;
1389
+ text-transform: uppercase;
1390
+ letter-spacing: 0.04em;
1391
+ color: rgb(var(--ndpr-muted-foreground));
1392
+ }
1393
+
1394
+ .ndpr-stat__value {
1395
+ margin: 0;
1396
+ font-size: var(--ndpr-font-size-xl);
1397
+ font-weight: 700;
1398
+ color: rgb(var(--ndpr-foreground));
1399
+ line-height: var(--ndpr-line-height-tight);
1400
+ }
1401
+
1402
+ .ndpr-stat__delta {
1403
+ margin: var(--ndpr-space-1) 0 0;
1404
+ font-size: var(--ndpr-font-size-xs);
1405
+ color: rgb(var(--ndpr-muted-foreground));
1406
+ }
1407
+
1408
+ /* ── Section heading (used inside cards) ───────────────────────────────── */
1409
+
1410
+ .ndpr-section-heading {
1411
+ margin: 0 0 var(--ndpr-space-3);
1412
+ font-size: var(--ndpr-font-size-base);
1413
+ font-weight: 600;
1414
+ color: rgb(var(--ndpr-foreground));
1415
+ }
1416
+
1417
+ .ndpr-section-divider {
1418
+ height: 1px;
1419
+ background: rgb(var(--ndpr-border));
1420
+ border: 0;
1421
+ margin: var(--ndpr-space-6) 0;
1422
+ }
1423
+
1424
+ /* ── Semantic text utilities ───────────────────────────────────────────── */
1425
+
1426
+ .ndpr-text-muted { color: rgb(var(--ndpr-muted-foreground)); }
1427
+ .ndpr-text-foreground { color: rgb(var(--ndpr-foreground)); }
1428
+ .ndpr-text-primary { color: rgb(var(--ndpr-primary)); }
1429
+ .ndpr-text-success { color: rgb(var(--ndpr-success)); }
1430
+ .ndpr-text-warning { color: rgb(var(--ndpr-warning)); }
1431
+ .ndpr-text-destructive { color: rgb(var(--ndpr-destructive)); }
1432
+ .ndpr-text-info { color: rgb(var(--ndpr-primary)); }
1433
+
1434
+ .ndpr-text-xs { font-size: var(--ndpr-font-size-xs); }
1435
+ .ndpr-text-sm { font-size: var(--ndpr-font-size-sm); }
1436
+ .ndpr-text-base { font-size: var(--ndpr-font-size-base); }
1437
+ .ndpr-text-lg { font-size: var(--ndpr-font-size-lg); }
1438
+ .ndpr-text-xl { font-size: var(--ndpr-font-size-xl); }
1439
+
1440
+ .ndpr-font-medium { font-weight: 500; }
1441
+ .ndpr-font-semibold { font-weight: 600; }
1442
+ .ndpr-font-bold { font-weight: 700; }