@digitalwalletcorp/vue-core 1.2.1 → 1.3.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 (188) hide show
  1. package/README.md +79 -3
  2. package/lib/accordion-fieldset.d.cts +14 -4
  3. package/lib/accordion-fieldset.d.ts +14 -4
  4. package/lib/accordion-section.d.cts +20 -10
  5. package/lib/accordion-section.d.ts +20 -10
  6. package/lib/components-2zQ2SZuY.js +26 -0
  7. package/lib/components-HaiHcseF.cjs +1 -0
  8. package/lib/components.d.cts +10 -0
  9. package/lib/components.d.ts +10 -0
  10. package/lib/copy-button.d.cts +34 -0
  11. package/lib/copy-button.d.ts +34 -0
  12. package/lib/dark-mode-selector.d.cts +32 -0
  13. package/lib/dark-mode-selector.d.ts +32 -0
  14. package/lib/data-table.d.cts +30 -0
  15. package/lib/data-table.d.ts +30 -0
  16. package/lib/help-button.d.cts +39 -0
  17. package/lib/help-button.d.ts +39 -0
  18. package/lib/help-popper.d.cts +39 -0
  19. package/lib/help-popper.d.ts +39 -0
  20. package/lib/helpers/data-table-csv.d.cts +17 -0
  21. package/lib/helpers/data-table-csv.d.ts +17 -0
  22. package/lib/helpers/show-floating-component.d.cts +82 -0
  23. package/lib/helpers/show-floating-component.d.ts +82 -0
  24. package/lib/helpers/show-modal-dialog.d.cts +73 -0
  25. package/lib/helpers/show-modal-dialog.d.ts +73 -0
  26. package/lib/helpers/show-overlay-box.d.cts +53 -0
  27. package/lib/helpers/show-overlay-box.d.ts +53 -0
  28. package/lib/helpers/show-screen-loading.d.cts +20 -0
  29. package/lib/helpers/show-screen-loading.d.ts +20 -0
  30. package/lib/helpers/show-snackbar.d.cts +47 -0
  31. package/lib/helpers/show-snackbar.d.ts +47 -0
  32. package/lib/hourglass-loading.d.cts +1 -1
  33. package/lib/hourglass-loading.d.ts +1 -1
  34. package/lib/index.cjs +1 -1
  35. package/lib/index.d.cts +34 -0
  36. package/lib/index.d.ts +34 -0
  37. package/lib/index.js +445 -18
  38. package/lib/internal/anchored-popover.d.cts +35 -0
  39. package/lib/internal/anchored-popover.d.ts +35 -0
  40. package/lib/internal/anchored-position.d.cts +50 -0
  41. package/lib/internal/anchored-position.d.ts +50 -0
  42. package/lib/internal/data-table-controls.d.cts +42 -0
  43. package/lib/internal/data-table-controls.d.ts +42 -0
  44. package/lib/internal/data-table-value.d.cts +32 -0
  45. package/lib/internal/data-table-value.d.ts +32 -0
  46. package/lib/internal/floating-component.d.cts +52 -0
  47. package/lib/internal/floating-component.d.ts +52 -0
  48. package/lib/internal/icon-popper.d.cts +32 -0
  49. package/lib/internal/icon-popper.d.ts +32 -0
  50. package/lib/internal/mount-window.d.cts +39 -0
  51. package/lib/internal/mount-window.d.ts +39 -0
  52. package/lib/internal/movable-window.d.cts +55 -0
  53. package/lib/internal/movable-window.d.ts +55 -0
  54. package/lib/internal/opened-overlay-boxes.d.cts +2 -0
  55. package/lib/internal/opened-overlay-boxes.d.ts +2 -0
  56. package/lib/internal/pagination.d.cts +22 -0
  57. package/lib/internal/pagination.d.ts +22 -0
  58. package/lib/internal/snackbar-container.d.cts +20 -0
  59. package/lib/internal/snackbar-container.d.ts +20 -0
  60. package/lib/internal/snackbar-item.d.cts +17 -0
  61. package/lib/internal/snackbar-item.d.ts +17 -0
  62. package/lib/internal/tab-group-context.d.cts +4 -2
  63. package/lib/internal/tab-group-context.d.ts +4 -2
  64. package/lib/internal/use-movable-window.d.cts +44 -0
  65. package/lib/internal/use-movable-window.d.ts +44 -0
  66. package/lib/internal/window-order.d.cts +6 -0
  67. package/lib/internal/window-order.d.ts +6 -0
  68. package/lib/intersection-lazy-component.d.cts +32 -0
  69. package/lib/intersection-lazy-component.d.ts +32 -0
  70. package/lib/label-button.d.cts +2 -2
  71. package/lib/label-button.d.ts +2 -2
  72. package/lib/label-icon.d.cts +2 -2
  73. package/lib/label-icon.d.ts +2 -2
  74. package/lib/modal-dialog.d.cts +67 -0
  75. package/lib/modal-dialog.d.ts +67 -0
  76. package/lib/nuxt.cjs +1 -1
  77. package/lib/nuxt.js +1 -1
  78. package/lib/overlay-box.d.cts +52 -0
  79. package/lib/overlay-box.d.ts +52 -0
  80. package/lib/page-section.d.cts +2 -2
  81. package/lib/page-section.d.ts +2 -2
  82. package/lib/page-title.d.cts +2 -2
  83. package/lib/page-title.d.ts +2 -2
  84. package/lib/register.cjs +1 -1
  85. package/lib/register.js +1 -1
  86. package/lib/screen-loading.d.cts +7 -0
  87. package/lib/screen-loading.d.ts +7 -0
  88. package/lib/style.css +1 -1
  89. package/lib/tab-content.d.cts +5 -5
  90. package/lib/tab-content.d.ts +5 -5
  91. package/lib/tab-group.d.cts +7 -10
  92. package/lib/tab-group.d.ts +7 -10
  93. package/lib/types/data-table.d.cts +185 -0
  94. package/lib/types/data-table.d.ts +185 -0
  95. package/lib/types/modal-dialog.d.cts +13 -0
  96. package/lib/types/modal-dialog.d.ts +13 -0
  97. package/lib/types/movable-window.d.cts +16 -0
  98. package/lib/types/movable-window.d.ts +16 -0
  99. package/lib/warning-popper.d.cts +39 -0
  100. package/lib/warning-popper.d.ts +39 -0
  101. package/lib/warning-popper.vue_vue_type_style_index_0_lang-CxVzqsbn.cjs +1 -0
  102. package/lib/warning-popper.vue_vue_type_style_index_0_lang-zt-jCsvz.js +1833 -0
  103. package/package.json +40 -14
  104. package/src/accordion-fieldset.vue +24 -19
  105. package/src/accordion-section.vue +33 -28
  106. package/src/components.ts +10 -0
  107. package/src/copy-button.vue +89 -0
  108. package/src/dark-mode-selector.vue +212 -0
  109. package/src/data-table.vue +643 -0
  110. package/src/help-button.vue +128 -0
  111. package/src/help-popper.vue +70 -0
  112. package/src/helpers/data-table-csv.ts +55 -0
  113. package/src/helpers/show-floating-component.ts +169 -0
  114. package/src/helpers/show-modal-dialog.ts +121 -0
  115. package/src/helpers/show-overlay-box.ts +106 -0
  116. package/src/helpers/show-screen-loading.ts +37 -0
  117. package/src/helpers/show-snackbar.ts +153 -0
  118. package/src/hourglass-loading.vue +1 -1
  119. package/src/index.ts +34 -0
  120. package/src/internal/anchored-popover.vue +192 -0
  121. package/src/internal/anchored-position.ts +135 -0
  122. package/src/internal/data-table-controls.vue +203 -0
  123. package/src/internal/data-table-value.ts +99 -0
  124. package/src/internal/floating-component.vue +202 -0
  125. package/src/internal/icon-popper.vue +185 -0
  126. package/src/internal/mount-window.ts +110 -0
  127. package/src/internal/movable-window.vue +315 -0
  128. package/src/internal/opened-overlay-boxes.ts +2 -0
  129. package/src/internal/pagination.vue +325 -0
  130. package/src/internal/snackbar-container.vue +258 -0
  131. package/src/internal/snackbar-item.ts +20 -0
  132. package/src/internal/tab-group-context.ts +4 -2
  133. package/src/internal/use-movable-window.ts +208 -0
  134. package/src/internal/window-order.ts +11 -0
  135. package/src/intersection-lazy-component.vue +84 -0
  136. package/src/label-button.vue +9 -6
  137. package/src/label-icon.vue +2 -2
  138. package/src/modal-dialog.vue +287 -0
  139. package/src/overlay-box.vue +218 -0
  140. package/src/page-section.vue +7 -7
  141. package/src/page-title.vue +4 -4
  142. package/src/screen-loading.vue +90 -0
  143. package/src/tab-content.vue +16 -15
  144. package/src/tab-group.vue +34 -36
  145. package/src/types/data-table.ts +196 -0
  146. package/src/types/modal-dialog.ts +16 -0
  147. package/src/types/movable-window.ts +18 -0
  148. package/src/warning-popper.vue +70 -0
  149. package/lib/accordion-fieldset.cjs +0 -1
  150. package/lib/accordion-fieldset.js +0 -4
  151. package/lib/accordion-fieldset.vue_vue_type_style_index_0_lang-Cf4czDXz.js +0 -66
  152. package/lib/accordion-fieldset.vue_vue_type_style_index_0_lang-DoM5QjpJ.cjs +0 -1
  153. package/lib/accordion-section.cjs +0 -1
  154. package/lib/accordion-section.js +0 -4
  155. package/lib/accordion-section.vue_vue_type_style_index_0_lang-CFDdUEnn.cjs +0 -1
  156. package/lib/accordion-section.vue_vue_type_style_index_0_lang-Gvjjx02P.js +0 -78
  157. package/lib/components-C63HJoCn.cjs +0 -1
  158. package/lib/components-q4Cf97bO.js +0 -24
  159. package/lib/hourglass-loading.cjs +0 -1
  160. package/lib/hourglass-loading.js +0 -4
  161. package/lib/hourglass-loading.vue_vue_type_style_index_0_lang-C72UVA9W.cjs +0 -1
  162. package/lib/hourglass-loading.vue_vue_type_style_index_0_lang-DkUGIxQ2.js +0 -22
  163. package/lib/label-button.cjs +0 -1
  164. package/lib/label-button.js +0 -4
  165. package/lib/label-button.vue_vue_type_style_index_0_lang-D7ZgfZOL.cjs +0 -1
  166. package/lib/label-button.vue_vue_type_style_index_0_lang-DqRYddVt.js +0 -44
  167. package/lib/label-icon.cjs +0 -1
  168. package/lib/label-icon.js +0 -4
  169. package/lib/label-icon.vue_vue_type_style_index_0_lang-D9Cimu20.cjs +0 -1
  170. package/lib/label-icon.vue_vue_type_style_index_0_lang-me52HE2V.js +0 -38
  171. package/lib/page-section.cjs +0 -1
  172. package/lib/page-section.js +0 -4
  173. package/lib/page-section.vue_vue_type_style_index_0_lang-DEAkTLxd.cjs +0 -1
  174. package/lib/page-section.vue_vue_type_style_index_0_lang-DpVQe_rV.js +0 -54
  175. package/lib/page-title.cjs +0 -1
  176. package/lib/page-title.js +0 -4
  177. package/lib/page-title.vue_vue_type_style_index_0_lang-BqIsIks5.cjs +0 -1
  178. package/lib/page-title.vue_vue_type_style_index_0_lang-ChZot85K.js +0 -36
  179. package/lib/tab-content.cjs +0 -1
  180. package/lib/tab-content.js +0 -4
  181. package/lib/tab-content.vue_vue_type_style_index_0_lang-BeCi7Xkp.cjs +0 -1
  182. package/lib/tab-content.vue_vue_type_style_index_0_lang-CcQLHmIF.js +0 -44
  183. package/lib/tab-group.cjs +0 -1
  184. package/lib/tab-group.js +0 -4
  185. package/lib/tab-group.vue_vue_type_style_index_0_lang-C84mDEOC.js +0 -103
  186. package/lib/tab-group.vue_vue_type_style_index_0_lang-CMaufRJV.cjs +0 -1
  187. package/lib/use-shrinkable-CS2bmsJJ.js +0 -17
  188. package/lib/use-shrinkable-Cu9JQZll.cjs +0 -1
@@ -0,0 +1,110 @@
1
+ import { defineComponent, getCurrentInstance, h, onBeforeUnmount, ref, render } from 'vue';
2
+ import type { AppContext, VNode } from 'vue';
3
+ import type { MovableWindowHandle } from '@/types/movable-window';
4
+
5
+ /** ウィンドウのコンポーネントに渡す、開閉とローディングの props とリスナー */
6
+ export interface WindowProps {
7
+ open: boolean;
8
+ loading: boolean;
9
+ 'onUpdate:open': (value: boolean) => void;
10
+ 'onEmit:close': () => void;
11
+ }
12
+
13
+ export interface MountWindowOptions {
14
+ /** 中身に引き継ぐアプリのコンテキスト */
15
+ appContext?: AppContext;
16
+ /** 利用者が指定した、閉じ終わったときに呼ぶ関数 */
17
+ onClose?: () => void;
18
+ /** 呼び出し側(use 系)が、閉じ終わったときに呼ぶ関数 */
19
+ onClosed?: () => void;
20
+ }
21
+
22
+ /**
23
+ * ウィンドウ(OverlayBox / FloatingComponent)を body の末尾に描画し、閉じ終わったら取り外す。
24
+ * 何をどう描くかは renderWindow に任せ、開閉・ローディング・取り外しの共通処理だけを持つ
25
+ *
26
+ * @param {(props: WindowProps, handle: MovableWindowHandle) => VNode} renderWindow ウィンドウを描画する関数
27
+ * @param {MountWindowOptions} options
28
+ * @param {Set<MovableWindowHandle>} opened 開いているハンドルの集合。closeAll 系で使う
29
+ * @returns {MovableWindowHandle}
30
+ */
31
+ export function mountWindow(
32
+ renderWindow: (props: WindowProps, handle: MovableWindowHandle) => VNode,
33
+ options: MountWindowOptions,
34
+ opened: Set<MovableWindowHandle>
35
+ ): MovableWindowHandle {
36
+ const container = document.createElement('div');
37
+ document.body.appendChild(container);
38
+ const open = ref(true);
39
+ const loading = ref(false);
40
+
41
+ const handle: MovableWindowHandle = {
42
+ close: () => {
43
+ open.value = false;
44
+ },
45
+ setLoading: (value: boolean) => {
46
+ loading.value = value;
47
+ }
48
+ };
49
+
50
+ const Host = defineComponent(() => {
51
+ return () => renderWindow({
52
+ open: open.value,
53
+ loading: loading.value,
54
+ 'onUpdate:open': (value: boolean) => {
55
+ open.value = value;
56
+ },
57
+ 'onEmit:close': () => {
58
+ opened.delete(handle);
59
+ render(null, container);
60
+ container.remove();
61
+ options.onClosed?.();
62
+ options.onClose?.();
63
+ }
64
+ }, handle);
65
+ });
66
+
67
+ const vnode = h(Host);
68
+ if (options.appContext) {
69
+ vnode.appContext = options.appContext;
70
+ }
71
+ render(vnode, container);
72
+ opened.add(handle);
73
+ return handle;
74
+ }
75
+
76
+ /**
77
+ * 呼び出したコンポーネントに結び付けてウィンドウを開くための共通処理。
78
+ * 開いたウィンドウはコンポーネントのアンマウント時に閉じ、中身にはコンポーネントのアプリのコンテキストを引き継ぐ。
79
+ * コンポーネントの setup の中で呼ぶこと
80
+ *
81
+ * @param {string} hookName setup の外で呼ばれたときのエラーに出す関数名
82
+ * @returns {{ appContext: AppContext; own: (open: (onClosed: () => void) => MovableWindowHandle) => MovableWindowHandle }}
83
+ */
84
+ export function useWindowOwner(hookName: string): {
85
+ appContext: AppContext;
86
+ own: (open: (onClosed: () => void) => MovableWindowHandle) => MovableWindowHandle;
87
+ } {
88
+ const instance = getCurrentInstance();
89
+ if (!instance) {
90
+ throw new Error(`${hookName}() must be called inside setup().`);
91
+ }
92
+ const ownedHandles = new Set<MovableWindowHandle>();
93
+
94
+ onBeforeUnmount(() => {
95
+ for (const handle of ownedHandles) {
96
+ handle.close();
97
+ }
98
+ });
99
+
100
+ return {
101
+ appContext: instance.appContext,
102
+ own: (open) => {
103
+ const handle = open(() => {
104
+ ownedHandles.delete(handle);
105
+ });
106
+ ownedHandles.add(handle);
107
+ return handle;
108
+ }
109
+ };
110
+ }
@@ -0,0 +1,315 @@
1
+ <!--
2
+ 見出し・閉じるボタン・本体・リサイズのつまみを持つウィンドウの枠(OverlayBox / FloatingComponent の共通部分)
3
+ ドラッグでの移動とリサイズを扱う。初期位置・初期サイズは利用側が expose した position / size に書き込んで決める。
4
+ 色や余白は --dwui-*-movable-window で受け取る。利用側のコンポーネントがこの変数に自分の公開変数を割り当てる。
5
+ 各部位には name を接頭辞にしたクラス(dwui-overlay-box-header など)も付け、利用側の公開クラス名で指定できるようにする。
6
+ -->
7
+ <template>
8
+ <div
9
+ ref="refWindow"
10
+ class="dwui-movable-window"
11
+ role="dialog"
12
+ :aria-labelledby="titleId"
13
+ :style="windowStyle"
14
+ >
15
+ <div
16
+ class="dwui-movable-window-frame"
17
+ @pointerdown="movableWindow.onDragStart"
18
+ >
19
+ <div
20
+ class="dwui-movable-window-header"
21
+ :class="[ `${props.name}-header`, props.headerClass, { 'dwui-movable': props.dragMode } ]"
22
+ :style="props.headerStyle"
23
+ @pointerdown="movableWindow.onDragHeaderStart"
24
+ >
25
+ <div
26
+ :id="titleId"
27
+ class="dwui-movable-window-title"
28
+ :class="`${props.name}-title`"
29
+ >
30
+ <slot name="title" />
31
+ </div>
32
+ <slot name="actions" />
33
+ <button
34
+ type="button"
35
+ class="dwui-movable-window-close-button"
36
+ :class="`${props.name}-close-button`"
37
+ :aria-label="props.closeLabel"
38
+ @click="emit('emit:close')"
39
+ >
40
+ <SvgNegativeSquaredCrossMark />
41
+ </button>
42
+ </div>
43
+ <div
44
+ class="dwui-movable-window-body"
45
+ :class="[ `${props.name}-body`, { 'dwui-movable': props.dragMode === 'body' } ]"
46
+ >
47
+ <slot />
48
+ </div>
49
+ </div>
50
+ <div
51
+ v-if="props.loading"
52
+ class="dwui-movable-window-loading"
53
+ :class="`${props.name}-loading`"
54
+ >
55
+ <div
56
+ class="dwui-movable-window-spinner"
57
+ :class="`${props.name}-spinner`"
58
+ />
59
+ </div>
60
+ <div
61
+ v-for="corner in cornersWithoutGrip"
62
+ :key="corner"
63
+ class="dwui-movable-window-corner"
64
+ :class="[ `${props.name}-corner`, `dwui-${corner}` ]"
65
+ @pointerdown.prevent="movableWindow.onResizeStart($event, corner)"
66
+ />
67
+ <div
68
+ class="dwui-movable-window-resizer"
69
+ :class="`${props.name}-resizer`"
70
+ @pointerdown.prevent="movableWindow.onResizeStart($event, 'bottom-right')"
71
+ >
72
+ <SvgCornerDiagonal direction="bottom-right" />
73
+ </div>
74
+ </div>
75
+ </template>
76
+
77
+ <script setup lang="ts">
78
+ import { computed, ref, useId } from 'vue';
79
+ import type { ClassValue, StyleValue } from 'vue';
80
+ import { SvgCornerDiagonal, SvgNegativeSquaredCrossMark } from '@digitalwalletcorp/vue-svg-icons';
81
+ import { useMovableWindow } from '@/internal/use-movable-window';
82
+ import type { MovableWindowCorner } from '@/internal/use-movable-window';
83
+ import type { MovableWindowDragMode } from '@/types/movable-window';
84
+
85
+ interface Props {
86
+ /** 各部位のクラスの接頭辞。利用側のコンポーネントのクラス名(dwui-overlay-box など) */
87
+ name: string;
88
+ /** ドラッグで移動するときに掴む範囲。未指定なら移動できない */
89
+ dragMode?: MovableWindowDragMode;
90
+ /** ウィンドウに暗幕とスピナーを重ね、中身を操作できなくする */
91
+ loading: boolean;
92
+ /** 閉じるボタンの読み上げ名 */
93
+ closeLabel: string;
94
+ /** ドラッグ終了時に下端も画面内へ戻す */
95
+ clampBottom: boolean;
96
+ /** 見出しに付けるクラス */
97
+ headerClass?: ClassValue;
98
+ /** 見出しに付けるスタイル */
99
+ headerStyle?: StyleValue;
100
+ }
101
+ const props = defineProps<Props>();
102
+
103
+ interface Emits {
104
+ /** 閉じるボタンが押された */
105
+ (e: 'emit:close'): void;
106
+ }
107
+ const emit = defineEmits<Emits>();
108
+
109
+ interface Slots {
110
+ /** 見出し */
111
+ title?(): unknown;
112
+ /** 見出しの閉じるボタンの手前に置く操作 */
113
+ actions?(): unknown;
114
+ /** ウィンドウに表示する中身 */
115
+ default?(): unknown;
116
+ }
117
+ defineSlots<Slots>();
118
+
119
+ const refWindow = ref<HTMLDivElement>();
120
+
121
+ const titleId = useId();
122
+
123
+ /** つまみのアイコンを置かず、透明な掴み領域だけでリサイズする角 */
124
+ const cornersWithoutGrip: MovableWindowCorner[] = ['top-left', 'top-right', 'bottom-left'];
125
+
126
+ const movableWindow = useMovableWindow({
127
+ target: refWindow,
128
+ dragMode: () => props.dragMode,
129
+ clampBottom: props.clampBottom
130
+ });
131
+
132
+ const windowStyle = computed(() => {
133
+ const { currentPosition, currentRect } = movableWindow;
134
+ return {
135
+ top: `${currentPosition.y}px`,
136
+ left: `${currentPosition.x}px`,
137
+ width: 0 <= currentRect.width ? `${currentRect.width}px` : undefined,
138
+ height: 0 <= currentRect.height ? `${currentRect.height}px` : undefined
139
+ };
140
+ });
141
+
142
+ defineExpose({
143
+ /** ウィンドウの要素 */
144
+ element: refWindow,
145
+ /** 位置(px)。書き込むと移動する */
146
+ position: movableWindow.currentPosition,
147
+ /** 幅・高さ(px)。-1 は中身に合わせる。書き込むとその寸法になる */
148
+ size: movableWindow.currentRect,
149
+ /** ドラッグ・リサイズのリスナーを解除する */
150
+ teardown: movableWindow.teardown
151
+ });
152
+ </script>
153
+
154
+ <style>
155
+ :where(.dwui-movable-window) {
156
+ position: absolute;
157
+ display: flex;
158
+ flex-direction: column;
159
+ box-sizing: border-box;
160
+ min-width: var(--dwui-min-width-movable-window, auto);
161
+ max-height: var(--dwui-max-height-movable-window, none);
162
+ border: 1px solid var(--dwui-border-color-movable-window, light-dark(#8f8f8f, #6b6f76));
163
+ border-radius: var(--dwui-radius-movable-window, 4px);
164
+ background: var(--dwui-background-movable-window, Canvas);
165
+ color: var(--dwui-color-text-movable-window, CanvasText);
166
+ box-shadow: var(--dwui-box-shadow-movable-window, 0 2px 8px rgba(0, 0, 0, 0.33));
167
+ outline: none;
168
+ overflow: hidden;
169
+ }
170
+
171
+ /* 見出しと本体を縦に並べ、本体に残りの高さを取らせる。高さが中身より小さいときは本体の中でスクロールする */
172
+ :where(.dwui-movable-window-frame) {
173
+ display: flex;
174
+ flex: 1 1 auto;
175
+ flex-direction: column;
176
+ min-height: 0;
177
+ }
178
+
179
+ :where(.dwui-movable-window-header) {
180
+ display: flex;
181
+ flex: 0 0 auto;
182
+ align-items: center;
183
+ gap: 0.33em;
184
+ padding: var(--dwui-padding-movable-window-header, 0.17em 0.33em);
185
+ border-bottom: 1px solid var(--dwui-border-color-movable-window, light-dark(#8f8f8f, #6b6f76));
186
+ background: var(--dwui-background-movable-window-header, transparent);
187
+ color: var(--dwui-color-text-movable-window-header, inherit);
188
+ }
189
+
190
+ :where(.dwui-movable-window-title) {
191
+ flex: 1;
192
+ min-width: 0;
193
+ overflow: hidden;
194
+ text-overflow: ellipsis;
195
+ white-space: nowrap;
196
+ }
197
+
198
+ :where(.dwui-movable-window-close-button) {
199
+ display: inline-flex;
200
+ align-items: center;
201
+ justify-content: center;
202
+ padding: 0.17em;
203
+ border: none;
204
+ border-radius: 4px;
205
+ background-color: transparent;
206
+ background-image: none;
207
+ color: inherit;
208
+ font: inherit;
209
+ cursor: pointer;
210
+ }
211
+
212
+ :where(.dwui-movable-window-close-button:hover) {
213
+ background: var(--dwui-background-movable-window-close-button-hover, light-dark(rgba(0, 0, 0, 0.08), rgba(255, 255, 255, 0.12)));
214
+ }
215
+
216
+ :where(.dwui-movable-window-close-button:focus-visible) {
217
+ outline: var(--dwui-outline-width-focus-ring, 2px) solid var(--dwui-outline-color-focus-ring, Highlight);
218
+ outline-offset: var(--dwui-outline-offset-focus-ring, 2px);
219
+ }
220
+
221
+ :where(.dwui-movable-window-body) {
222
+ flex: 1 1 auto;
223
+ box-sizing: border-box;
224
+ min-height: 0;
225
+ padding: var(--dwui-padding-movable-window-body, 0.4em);
226
+ overflow: auto;
227
+ }
228
+
229
+ :where(.dwui-movable-window-header.dwui-movable, .dwui-movable-window-body.dwui-movable) {
230
+ cursor: move;
231
+ /* 指で動かしたときにブラウザのスクロールとして扱われないようにする */
232
+ touch-action: none;
233
+ }
234
+
235
+ /* 見出しを掴んで動かすときに文字が選択されないようにする */
236
+ :where(.dwui-movable-window-header.dwui-movable) {
237
+ user-select: none;
238
+ }
239
+
240
+ :where(.dwui-movable-window-resizer) {
241
+ position: absolute;
242
+ right: 0;
243
+ bottom: 0;
244
+ width: 18px;
245
+ height: 18px;
246
+ color: var(--dwui-color-text-movable-window-resizer, GrayText);
247
+ cursor: nwse-resize;
248
+ touch-action: none;
249
+ }
250
+
251
+ /* つまみ本体でドラッグを受けるため、アイコンはイベントを透過させる */
252
+ :where(.dwui-movable-window-resizer > svg) {
253
+ display: block;
254
+ pointer-events: none;
255
+ }
256
+
257
+ /*
258
+ * アイコンの無い角の掴み領域。
259
+ * clip-path で辺に沿った L 字の帯だけを残す。クリップされた部分はポインタの判定からも外れるため、
260
+ * 角に近い閉じるボタンや本体の操作を奪わない
261
+ */
262
+ :where(.dwui-movable-window-corner) {
263
+ position: absolute;
264
+ width: 18px;
265
+ height: 18px;
266
+ touch-action: none;
267
+ }
268
+
269
+ :where(.dwui-movable-window-corner.dwui-top-left) {
270
+ top: 0;
271
+ left: 0;
272
+ clip-path: polygon(0 0, 100% 0, 100% 6px, 6px 6px, 6px 100%, 0 100%);
273
+ cursor: nwse-resize;
274
+ }
275
+
276
+ :where(.dwui-movable-window-corner.dwui-top-right) {
277
+ top: 0;
278
+ right: 0;
279
+ clip-path: polygon(0 0, 100% 0, 100% 100%, calc(100% - 6px) 100%, calc(100% - 6px) 6px, 0 6px);
280
+ cursor: nesw-resize;
281
+ }
282
+
283
+ :where(.dwui-movable-window-corner.dwui-bottom-left) {
284
+ bottom: 0;
285
+ left: 0;
286
+ clip-path: polygon(0 0, 6px 0, 6px calc(100% - 6px), 100% calc(100% - 6px), 100% 100%, 0 100%);
287
+ cursor: nesw-resize;
288
+ }
289
+
290
+ :where(.dwui-movable-window-loading) {
291
+ position: absolute;
292
+ inset: 0;
293
+ z-index: 1;
294
+ display: flex;
295
+ align-items: center;
296
+ justify-content: center;
297
+ background: var(--dwui-background-movable-window-loading, light-dark(rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.4)));
298
+ }
299
+
300
+ :where(.dwui-movable-window-spinner) {
301
+ box-sizing: border-box;
302
+ width: var(--dwui-size-movable-window-spinner, 48px);
303
+ height: var(--dwui-size-movable-window-spinner, 48px);
304
+ border: 6px solid var(--dwui-border-color-movable-window-spinner, light-dark(rgba(0, 0, 0, 0.15), rgba(255, 255, 255, 0.2)));
305
+ border-left-color: var(--dwui-border-color-movable-window-spinner-accent, light-dark(rgba(47, 90, 74, 0.8), rgba(140, 200, 170, 0.8)));
306
+ border-radius: 50%;
307
+ animation: dwui-movable-window-spin 1.1s linear infinite;
308
+ }
309
+
310
+ @keyframes dwui-movable-window-spin {
311
+ to {
312
+ transform: rotate(360deg);
313
+ }
314
+ }
315
+ </style>
@@ -0,0 +1,2 @@
1
+ /** 開いている OverlayBox を開いた順に持つ。Esc では最後に開いたものだけを閉じる */
2
+ export const openedOverlayBoxes: symbol[] = [];